我正在尝试构建一个链接到APR的Python扩展。这次是在MS Windows上...(在Linux上可用)。
在这里构建失败,命令和输出经过格式化以提高可读性:
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:c:\dev\protopy\lib/apr
/LIBPATH:c:\bin\python\Libs
/LIBPATH:c:\dev\protopy\.venv\libs
/LIBPATH:c:\dev\protopy\.venv\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"
apr-1.lib
/EXPORT:PyInit_wrapped build\temp.win-amd64-3.6\Release\protopy/lib/descriptors.obj
build\temp.win-amd64-3.6\Release\protopy/lib/binparser.obj
build\temp.win-amd64-3.6\Release\protopy/lib/defparser.obj
build\temp.win-amd64-3.6\Release\protopy/lib/protopy.lex.obj
build\temp.win-amd64-3.6\Release\protopy/lib/protopy.tab.obj
build\temp.win-amd64-3.6\Release\protopy/lib/pyhelpers.obj
build\temp.win-amd64-3.6\Release\protopy/lib/list.obj
build\temp.win-amd64-3.6\Release\protopy/wrapper.obj
/OUT:build\lib.win-amd64-3.6\protopy\wrapped.cp36-win_amd64.pyd
/IMPLIB:build\temp.win-amd64-3.6\Release\protopy/lib\wrapped.cp36-win_amd64.lib
wrapper.obj : warning LNK4197: export 'PyInit_wrapped' specified multiple times; using first specification
Creating library build\temp.win-amd64-3.6\Release\protopy/lib\wrapped.cp36-win_amd64.lib \
and object build\temp.win-amd64-3.6\Release\protopy/lib\wrapped.cp36-win_amd64.exp
descriptors.obj : error LNK2001: unresolved external symbol \
__imp_apr_hash_set
(它实际上会丢失我使用的所有符号,而不仅仅是这个符号)。
我之前通过在APR的顶级目录中运行apr-1.lib
来构建nmake -f Makefile.win
,这就是我产生libapr-1.lib
的方式。然后,我将其重命名为apr-1.lib
并将其放在c:\dev\protopy\lib/apr
中,因此链接程序实际上可以找到它,但是找不到所需的符号...
如何查看库中的符号? (也许我编译错了吗?)
好的,我发现dumpbin.exe
,但是现在我看到apr-1.lib
中的符号被称为__imp__apr_hash_set
(注意第二个双下划线),但是链接程序查找{{1 }}(下划线)。是什么赋予了?它们使用相同的编译器/链接器进行编译...
在MS Windows上构建Python扩展是否有使其工作的特定方式? (我一生只尝试过一次,但由于不同的原因而无法使它起作用)。
答案 0 :(得分:0)
根据APR项目文件
选择aprutil或libaprutil(对于静态或动态库)
表示apr-1.lib-->static
和libapr-1.lib -->dynamic
和
要针对库的静态.lib版本,使用者必须定义宏APR_DECLARE_STATIC和APU_DECLARE_STATIC。这样可以防止将apr和apr-util符号标记为__declspec(dllimport),从而消除了编译警告并加快了执行速度。