DLL是在Linux上编译的,但与之链接的DLL需要使用MSVC进行编译。如果需要,我可以灵活地使用MinGW的版本,但我必须使用这个MSVC版本。这是因为我需要为Python 3.5或更高版本编译绑定。
我遇到的问题是,在链接时__imp___iob_func
找不到fprintf
。如果我试图自己申报,我会被告知他们已经定义了......
以下是MSVC命令及其输出(为便于阅读而格式化)
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe
/c
/nologo
/Ox
/W3
/GL
/DNDEBUG
/MD
-Ipykubectl\lib
-Ic:\bin\python\include
-Ic:\bin\python\include
"-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt"
"-IC:\Program Files (x86)\Windows Kits\8.1\include\shared"
"-IC:\Program Files (x86)\Windows Kits\8.1\include\um"
"-IC:\Program Files (x86)\Windows Kits\8.1\include\winrt"
/Tcpykubectl\lib\bindings.c
/Fobuild\temp.win-amd64-3.6\Release\pykubectl\lib\bindings.obj
bindings.c
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe
/c
/nologo
/Ox
/W3
/GL
/DNDEBUG
/MD
-Ipykubectl\lib
-Ic:\bin\python\include
-Ic:\bin\python\include
"-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE"
"-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt"
"-IC:\Program Files (x86)\Windows Kits\8.1\include\shared"
"-IC:\Program Files (x86)\Windows Kits\8.1\include\um"
"-IC:\Program Files (x86)\Windows Kits\8.1\include\winrt"
/Tcpykubectl\wrapped.c
/Fobuild\temp.win-amd64-3.6\Release\pykubectl\wrapped.obj
wrapped.c
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe
/nologo
/INCREMENTAL:NO
/LTCG
/DLL
/MANIFEST:EMBED,ID=2
/MANIFESTUAC:NO
/LIBPATH:pykubectl\lib
/LIBPATH:c:\bin\python\Libs
/LIBPATH:C:\Users\IEUser\.virtualenvs\pykubectl-yOsvavBP\libs
/LIBPATH:C:\Users\IEUser\.virtualenvs\pykubectl-yOsvavBP\PCbuild\amd64
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64"
gokubectl.lib winmm.lib ws2_32.lib msvcrt.lib
/EXPORT:PyInit_wrapped
build\temp.win-amd64-3.6\Release\pykubectl\lib\bindings.obj
build\temp.win-amd64-3.6\Release\pykubectl\wrapped.obj
/OUT:build\lib.win-amd64-3.6\pykubectl\wrapped.cp36-win_amd64.pyd
/IMPLIB:build\temp.win-amd64-3.6\Release\pykubectl\lib\wrapped.cp36-win_amd64.lib
gokubectl.lib(go.o) : warning LNK4078: multiple '.text' sections found with different attributes (61600060)
wrapped.obj : warning LNK4197: export 'PyInit_wrapped' specified multiple times; using first specification
Creating library build\temp.win-amd64-3.6\Release\pykubectl\lib\wrapped.cp36-win_amd64.lib and object build\temp.win-amd64-3.6\Release\pykubectl\lib\wrapped.cp36-win_amd64.exp
gokubectl.lib(000001.o) : error LNK2001: unresolved external symbol fprintf
gokubectl.lib(000001.o) : error LNK2001: unresolved external symbol __imp___iob_func
build\lib.win-amd64-3.6\pykubectl\wrapped.cp36-win_amd64.pyd : fatal error LNK1120: 2 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\link.exe' failed with exit status 1120
这就是如何编译需要链接的DLL:
x86_64-w64-mingw32-gcc-win32 -shared -pthread \
-o pykubectl/lib/gokubectl.dll
pykubectl/lib/win_gokubectl.c
pykubectl/lib/libgokubectl.a
-lwinmm
-lntdll
-lws2_32
libgokubectl.a
是通过编译一些Go代码获得的。
PS。这里有一个问题是重复的:它确实是同样的问题,但它提供的解决方案并不可行。我不介意我的问题的答案是在那个帖子而不是在这里给出的。请记住,现有的答案不起作用/需要更新以反映所涉及的编译器的特定版本的实际情况。