Boost.Python快速入门链接器错误

时间:2015-03-14 19:21:28

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

我只是按照说明here来启动Quickstart示例。我在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...

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

问题仍然存在于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 ;
    
  3. 我已经使用VS2012和Python 2.7在Win7上对此进行了测试。

答案 1 :(得分:1)

我也看到了不兼容的PDB格式问题,但只有1.57,(因为Boost.Python源代码对于1.57和1.55是相同的,我可以让它在1.55上运行)我猜测是某种程度上相关的对boost :: build路径的更改。

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

答案 2 :(得分:1)

我告诉你疯了。

无论如何,我终于在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)复制到quickstart文件夹中
  • 最后构建
  

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

同样,这是-crazy-复合体。所有其他东西构建都很好,但是python链接确实坏了。无论如何,万一有人尝试,希望这会有所帮助。