MSVC 19.00链接到使用MinGW 6.2.1编译的DLL

时间:2018-02-01 09:03:45

标签: windows visual-c++ dll mingw

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。这里有一个问题是重复的:它确实是同样的问题,但它提供的解决方案并不可行。我不介意我的问题的答案是在那个帖子而不是在这里给出的。请记住,现有的答案不起作用/需要更新以反映所涉及的编译器的特定版本的实际情况。

0 个答案:

没有答案