【问题标题】:Boost.Python Quickstart Linker ErrorsBoost.Python 快速入门链接器错误
【发布时间】:2015-03-14 19:21:28
【问题描述】:

我只是想按照here 的说明来让快速入门示例正常工作。我在 Windows 7 上并尝试使用 MSVC。我已经安装了 Python 2.7。

我做了什么:

  • 下载 boost_1_57_0.zip 并解压到C:\boost_1_57_0
  • C:\boost_1_57_0 中的命令提示符运行:

    bootstrap
    

    然后:

    .\b2
    

    按照 5.1 here 下的说明。在此之后,我有一条消息说“Boost C++ 库已成功构建!”。

  • C:\boost_1_57_0 添加到我的路径中。说明并没有说要这样做,但由于他们希望我调用 bjam,而这就是它所在的地方,我认为我需要这样做。
  • 修改C:\boost_1_57_0\libs\python\example\quickstart\boost-build.jam,使路径为boost-build ../../../../tools/build/src ; 而不是boost-build ../../../../tools/build/v2 ;。这是按照here 的说明进行的,因为原始路径是错误的,如果您不这样做,则 bjam 调用将失败。
  • CD 进入C:\boost_1_57_0\libs\python\example\quickstart 并运行:

    bjam toolset=msvc --verbose-test test
    

我得到的输出首先是:

...patience...
...patience...
...found 1926 targets...
...updating 55 targets...
common.mkdir bin
common.mkdir bin\test_ext.test
common.mkdir bin\test_ext.test\msvc-12.0
common.mkdir bin\test_ext.test\msvc-12.0\debug
common.mkdir bin\test_ext.test\msvc-12.0\debug\threading-multi
common.mkdir bin\msvc-12.0
common.mkdir bin\msvc-12.0\debug
common.mkdir bin\msvc-12.0\debug\threading-multi
compile-c-c++ bin\msvc-12.0\debug\threading-multi\extending.obj
extending.cpp
c:\python27\include\pymath.h(22) : warning C4273: 'round' : inconsistent dll linkage
    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\math.h(516) : see previous definition of 'round'
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xtgmath.h(190) : warning C4273: '_hypot' : inconsistent dll linkage

接着是一长串其他头文件条目,每个都抱怨 dll 链接不一致,最后是一堆错误,其中亮点包括:

LINK : fatal error LNK1207: incompatible PDB format in 'C:\boost_1_57_0\libs\python\example\quickstart\bin\msvc-12.0\debug\threading-multi\extending.pdb'; delete and rebuild

...failed msvc.link.dll bin\msvc-12.0\debug\threading-multi\extending.pyd bin\msvc-12.0\debug\threading-multi\extending.pdb...
...removing bin\msvc-12.0\debug\threading-multi\extending.pdb

LINK : warning LNK4001: no object files specified; libraries used
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
bin\test_embed.test\msvc-12.0\debug\threading-multi\test_embed.exe : fatal error LNK1120: 1 unresolved externals

...failed msvc.link bin\test_embed.test\msvc-12.0\debug\threading-multi\test_embed.exe bin\test_embed.test\msvc-12.0\debug\threading-multi\test_embed.pdb...
...removing bin\test_embed.test\msvc-12.0\debug\threading-multi\test_embed.pdb
...skipped <pbin\test_embed.test\msvc-12.0\debug\threading-multi>test_embed.run for lack of <pbin\test_embed.test\msvc-12.0\debug\threading-multi>test_embed.exe...
...failed updating 4 targets...

有什么想法吗?

【问题讨论】:

    标签: python c++ visual-c++ boost boost-python


    【解决方案1】:

    这个问题在 1.59 中仍然存在。通过编辑文件,我设法让 Boost.Build 再次工作:

    D:\boost\boost_1_59_0\tools\build\src\tools\msvc.jam
    

    我做了两处改动:

    1. 更改此(第 #1351-1355 行):

           generators.register [ new msvc-linking-generator msvc.link.dll :
               OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB :
               <toolset>msvc <suppress-import-lib>false ] ;
           generators.register [ new msvc-linking-generator msvc.link.dll :
               OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB :
               <toolset>msvc <suppress-import-lib>true ] ;
      

      到:

          generators.register [ new msvc-linking-generator msvc.link.dll :
              OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB :
              <toolset>msvc ] ;
      
    2. 删除这一行(#1472):

          toolset.flags msvc.link.dll LINKFLAGS <suppress-import-lib>true : /NOENTRY ;
      

    我已经在 Win7 上使用 VS2012 和 Python 2.7 进行了测试。

    【讨论】:

    • 我可以确认当前的boost 1.62 有同样的问题。此修复程序有效(在 Windows 10 上使用 msvc-12python-3.4 测试)。
    【解决方案2】:

    我还看到了不兼容的 PDB 格式问题,但仅限于 1.57,它(因为 Boost.Python 源对于 1.57 和 1.55 是相同的,我可以让它在 1.55 上工作)我猜这与boost::build 路径的变化。

    我已经 documented what I had to do 让它与 1.55 一起工作,也许这会有所帮助。

    【讨论】:

    • 谢谢,对不起,我不得不离开这个并且几个月没有再试一次,但现在我已经按照链接的说明进行操作,它似乎可以工作。对于其他人:似乎最简单的做法是使用 1.55,因为 1.56 及更高版本存在 pdb 格式问题。另外,我认为我不会按照您的建议设置 user-config.jam。顺便说一句,您在博客上的 user-config.jam 中有错字 - 您在这里拼错了“python”:“C:\\Pyhton27-32\\libs # link libs”。
    • 我已经更新了要点,感谢您指出该错误。 1.59 也将于下周发布,我希望届时能解决这个问题。
    【解决方案3】:

    我告诉你疯了。

    无论如何,我终于成功地在 boost_1_68_0 上构建了快速入门示例。 快速指南:

    • (在 windows 上,安装了 Visual Studio 2017 和 SDK,安装了 python 3.5)
    • 下载并解压到 C:\boost_1_68_0 中
    • 运行 bootstrap.bat
    • 构建 boost-python 库:

    C:\boost_1_68_0>.\b2 --with-python -j4

    • 转到 C:\boost_1_68_0\libs\python\example,并修复 Jamroot 以找到您的头文件

        project
      : requirements
        <include>C:\\boost_1_68_0
        <library>boost_python
    • 按照 Ralph 在本文中评论的方式修复 tools\build\src\tools\msvc.jam 文件
    • here 所述,通过在任何地方添加“#define BOOST_PYTHON_STATIC_LIB”作为第一行来修补 embedding.cpp 和 extended.cpp
    • 将构建的 python-boost 库(从 C:\boost_1_68_0\stage\lib)复制到快速入门文件夹
    • 终于建好了

    C:\boost_1_68_0\libs\python\example\quickstart>..\..\..\..\b2.exe -j4

    再一次,这是-疯狂-复杂。所有其他的东西都构建得很好,但是 python 链接真的坏了。无论如何,如果有人尝试,希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2023-03-15
      相关资源
      最近更新 更多