Boost.Python 1.54(调试版本)对Windows上的Python27.lib的依赖性令人费解

时间:2013-10-31 21:24:18

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

我必须犯一些明显的错误,但经过几个小时的战斗,我无法取得进一步的进展:

升级到Boost 1.54,CMake 2.8.12和Python 2.7.5(所有三个来自略微早期的次要版本)后,我的project的Python绑定不再在Debug中链接配置(它们在Release中链接正常)。我正在使用VS 2012构建。在更新之前一切正常工作

我以标准方式构建了Boost:bootstrap.bat后跟b2 address-model=64 toolset=msvc-11.0。我的系统有一个Python 2.7安装,由b2选择:

notice: [python-cfg] Configuring python...
notice: [python-cfg] Registry indicates Python 2.7 installed at "C:\Python27\"
notice: [python-cfg] Checking interpreter command "python"...
notice: [python-cfg] running command 'DIR /-C /A:S "C:\Python27\python.exe" 2>&1'
notice: [python-cfg] running command 'python -c "from sys import *; print('version=%d.%d\nplatform=%s\nprefix=%s\nexec_prefix=%s\nexecutable=%s' % (version_info[0],version_info[1],platform,prefix,exec_prefix,executable))" 2>&1'
notice: [python-cfg] ...requested configuration matched!
notice: [python-cfg] Details of this Python configuration:
notice: [python-cfg]   interpreter command: "python"
notice: [python-cfg]   include path: "C:\Python27\Include"
notice: [python-cfg]   library path: "C:\Python27\libs"
notice: [python-cfg]   DLL search path: "C:\Python27"

我的机器上没有任何其他Python安装。

当我在项目上运行CMake时,一切看起来都很好:

Found PythonLibs: optimized;C:/Python27/libs/python27.lib;debug;C:/Python27/libs/python27_d.lib (found version "2.7.5")

Debug中链接器命令行的相关部分是预期的:

"C:\franz\dev\boost_1_54_0\stage\lib\libboost_python-vc110-mt-gd-1_54.lib" "C:\Python27\libs\python27_d.lib"

当我最终在Debug中构建项目时:

LINK : fatal error LNK1104: cannot open file 'python27.lib'

由于链接器命令行中没有提到python27.lib,我使用十六进制编辑器编辑libboost_python-vc110-mt-gd-1_54.lib只是为了发现它包含对python27.lib的引用({{1} }})我希望引用/DEFAULTLIB:"python27.lib"而不是({没有)。

构建Boost时我做错了什么?这是Boost 1.5中Boost.Python的已知问题吗?非常感谢任何帮助。


更新#1:我再次尝试使用Boost 1.51和1.50并出现同样的问题,因此它不是Boost中的回归。

更新#2:我从Python安装中删除了Python lib(python27_d.lib)的调试版本,从而恢复为vanilla Python安装。然后我重建了Boost 1.51和我的项目(CMake按预期报告了一个库文件:python27_d.lib)。问题仍然存在,但错误消息现在提到了python27_d.lib:Found PythonLibs: C:/Python27/libs/python27.lib (found version "2.7.5")

更新#3:使用Process Monitor我可以在实际所在的LINK : fatal error LNK1104: cannot open file 'python27_d.lib'中搜索python27_d.lib:

C:\Python27\libs\

更新#4 :相关问题:Visual C++ debug library naming convention

2 个答案:

答案 0 :(得分:9)

我已修复此问题,感谢此帖中的提示:Visual C++ debug library naming convention

基本上,Python附带的头文件pyconfig.h(在C:\Python27\include\中)强制链接到Debug版本中的python27_d.lib(通过#pragma comment()指令),无论是否这个图书馆是否存在。

诀窍是永远不要直接包含Python.h,而是要包含Boost的文件包装器boost/python/detail/wrap_python.hpp,它负责禁用有问题的#pragma comment()指令。

答案 1 :(得分:1)

包括boost/python/detail/wrap_python.hpp而不是Python.h允许您使用Python的发行版本,即使在构建程序的调试版本时也是如此。

如果你自己编译了Python的调试版本,你可以构建一个Boost的调试版本,它链接你的调试版本的Python。 (我使用的是VS2013,但VS2010和VS2012的过程应该相同)。

首先创建一个名为my_config.bjam conatining:

的文本文件
using python : 2.7                                     #version 
: C:\\Python-2.7.10-64bit-dbg-msvc12\\python_d.exe     #executable
: C:\\Python-2.7.10-64bit-dbg-msvc12\\include          #includes
: C:\\Python-2.7.10-64bit-dbg-msvc12\\libs             #libs
: <python-debugging>on ;

为了构建Boost的调试版本,首先运行bootstrap.bat,然后使用以下选项运行b2

b2 ^
--build-dir=build__64bit-dbg-msvc12 ^
--build-type=complete ^
--stagedir=stage__64bit-dbg-msvc12 ^
--user-config=my_config.bjam ^
address-model=64 ^
python-debugging=on ^
define=BOOST_PYTHON_DEBUG ^
define=BOOST_PYTHON_NO_LIB ^
link=shared ^
toolset=msvc-12.0 ^
variant=debug ^
stage

这应该可以解决问题。在编译程序的调试版本时,也应该定义BOOST_PYTHON_DEBUG