在MS Windows上与Apache Portable Runtime链接

时间:2018-06-19 13:43:35

标签: windows visual-c++ python-extensions apr

我正在尝试构建一个链接到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中,因此链接程序实际上可以找到它,但是找不到所需的符号...

问题1

如何查看库中的符号? (也许我编译错了吗?)


好的,我发现dumpbin.exe,但是现在我看到apr-1.lib中的符号被称为__imp__apr_hash_set(注意第二个双下划线),但是链接程序查找{{1 }}(下划线)。是什么赋予了?它们使用相同的编译器/链接器进行编译...

问题2

在MS Windows上构建Python扩展是否有使其工作的特定方式? (我一生只尝试过一次,但由于不同的原因而无法使它起作用)。

1 个答案:

答案 0 :(得分:0)

根据APR项目文件

  

选择aprutil或libaprutil(对于静态或动态库)

表示apr-1.lib-->staticlibapr-1.lib -->dynamic

  

要针对库的静态.lib版本,使用者必须定义宏APR_DECLARE_STATIC和APU_DECLARE_STATIC。这样可以防止将apr和apr-util符号标记为__declspec(dllimport),从而消除了编译警告并加快了执行速度。