有没有办法从Microsoft Visual Studio C++中调用Go代码?
请不要随意关闭我的问题。
这个链接如何使用Visual Studio编译器构建带有cgo的库?没有回答我的问题。它没有给出可行的解决方案。
目前似乎只能使用mingw gcc来编译cgo。https://github.com/golang/go/issues/49080#issuecomment-947865866 所以,目前看来这个问题是无法解决的。
因为mingw c头文件与Windows SDK并不完全相同,总会有一些代码无法正常工作。
这就像一个“存在”或“不存在”的问题。
如果你想从C++调用Go代码,请使用mingw gcc来编译所有的代码。
你不能用mingw编译cgo然后在Visual Studio C++中使用它。(也许可以,但总会有一些代码无法正常工作)
我找到的唯一方法是使用mingw gcc编译cgo,如此链接https://gist.github.com/geraldstanje/4624ac47eb3dec5b8bbe12d4714ed330。
但是这种方法有一个问题。
如果您将.a库与普通Visual C ++代码链接,则会失败,因为.a库包含Visual C ++不知道的符号。
如果你用mingw gcc将.a库与visual c++代码链接起来,
嗯,会有更多的问题。因为mingw头文件与Windows SDK头文件并不完全同步,会出现很多错误。
就像这个例子一样。
这是因为mingw的netioapi.h头文件与Windows SDK的netioapi.h头文件不同。
而Windows SDK的netioapi.h头文件包含了DNS_INTERFACE_SETTINGS声明,但mingw的netioapi.h头文件没有。
请不要随意关闭我的问题。
这个链接如何使用Visual Studio编译器构建带有cgo的库?没有回答我的问题。它没有给出可行的解决方案。
目前似乎只能使用mingw gcc来编译cgo。https://github.com/golang/go/issues/49080#issuecomment-947865866 所以,目前看来这个问题是无法解决的。
因为mingw c头文件与Windows SDK并不完全相同,总会有一些代码无法正常工作。
这就像一个“存在”或“不存在”的问题。
如果你想从C++调用Go代码,请使用mingw gcc来编译所有的代码。
你不能用mingw编译cgo然后在Visual Studio C++中使用它。(也许可以,但总会有一些代码无法正常工作)
我找到的唯一方法是使用mingw gcc编译cgo,如此链接https://gist.github.com/geraldstanje/4624ac47eb3dec5b8bbe12d4714ed330。
但是这种方法有一个问题。
如果您将.a库与普通Visual C ++代码链接,则会失败,因为.a库包含Visual C ++不知道的符号。
clang -w *.cpp v2pn.a
LINK : warning LNK4217: symbol '__acrt_iob_func' defined in 'libucrt.lib(_file.obj)' is imported by 'v2pn.a(000005.o)' in function '_cgo_preinit_init'
LINK : warning LNK4286: symbol '__acrt_iob_func' defined in 'libucrt.lib(_file.obj)' is imported by 'v2pn.a(000006.o)'
LINK : warning LNK4217: symbol '_errno' defined in 'libucrt.lib(errno.obj)' is imported by 'v2pn.a(000005.o)' in function '_cgo_beginthread'
v2pn.a(000005.o) : error LNK2019: unresolved external symbol __imp__beginthread referenced in function _cgo_beginthread
v2pn.a(000005.o) : error LNK2019: unresolved external symbol __mingw_vfprintf referenced in function fprintf
v2pn.a(000006.o) : error LNK2001: unresolved external symbol __mingw_vfprintf
a.exe : fatal error LNK1120: 2 unresolved externals
clang: error: linker command failed with exit code 1120 (use -v to see invocation)
如果你用mingw gcc将.a库与visual c++代码链接起来,
嗯,会有更多的问题。因为mingw头文件与Windows SDK头文件并不完全同步,会出现很多错误。
就像这个例子一样。
gcc.exe *.cpp v2pn.a
v2pn.cpp: In function 'void set_dns_by_guid(PCHAR)':
v2pn.cpp:48:5: error: 'DNS_INTERFACE_SETTINGS' was not declared in this scope
48 | DNS_INTERFACE_SETTINGS settings = {DNS_INTERFACE_SETTINGS_VERSION1};
| ^~~~~~~~~~~~~~~~~~~~~~
v2pn.cpp:49:5: error: 'settings' was not declared in this scope
49 | settings.Flags = 0x0002;
| ^~~~~~~~
v2pn.cpp:51:17: error: 'SetInterfaceDnsSettings' was not declared in this scope
51 | DWORD ret = SetInterfaceDnsSettings(interfaceGUID, &settings);
| ^~~~~~~~~~~~~~~~~~~~~~~
这是因为mingw的netioapi.h头文件与Windows SDK的netioapi.h头文件不同。
而Windows SDK的netioapi.h头文件包含了DNS_INTERFACE_SETTINGS声明,但mingw的netioapi.h头文件没有。