代码之家  ›  专栏  ›  技术社区  ›  wvxvw

在MS Windows上与Apache可移植运行时链接

  •  0
  • wvxvw  · 技术社区  · 6 年前

    我正在尝试构建一个Python扩展,它连接到APR.,这次是在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-1.lib 通过运行 nmake -f Makefile.win 在apr的顶级目录中,这是我如何生成的 libapr-1.lib . 然后我改名为 APL-1.LIB 把它放进去 c:\dev\protopy\lib/apr ,因此链接器实际上能够找到它,但找不到所需的符号…

    问题1

    我怎样才能看到图书馆里有什么符号?(也许我编错了?)


    好的,我找到了 dumpbin.exe ,但现在我看到 APL-1.LIB 被称为 __imp__apr_hash_set (注意第二个双下划线),但是链接器查找 __imp_apr_hash_set (单下划线)。给出了什么?它们是用相同的编译器/链接器编译的…

    问题2

    在ms-windows上构建python扩展有什么特别之处使其以这种方式工作吗?(我这辈子只试过一次,没能成功,但原因不同)。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tanzer    6 年前

    根据APR项目文件

    选择APPLUTIL或LIABAPUTL(静态或动态库)

    方法 apr-1.lib-->static libapr-1.lib -->dynamic

    要针对库的静态.LIB版本,消耗的编译必须定义宏ApLyDeCalayStstatic和ApUdDealRayIsstatic。这防止了APR和APR UTIL符号被标记为Y-O-DESPECUR(DLLIMPART),消除了编译警告并加快了执行速度。