【问题标题】:Puzzling dependency of Boost.Python 1.54 (debug build) to Python27.lib on WindowsBoost.Python 1.54(调试版本)对 Windows 上 Python27.lib 的令人费解的依赖关系
【发布时间】:2013-11-12 01:39:49
【问题描述】:

我一定是犯了某种明显的错误,但经过数小时的战斗,我无法取得进一步的进展:

在升级到 Boost 1.54、CMake 2.8.12 和 Python 2.7.5(所有三个较早的次要版本)后,我的 project 的 Python 绑定不再链接到调试配置中(它们在 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(形式为/DEFAULTLIB:"python27.lib")的引用,这是我所期望的引用python27_d.lib 而不是(其中没有)。

我在构建 Boost 时是否做错了什么?这是 Boost 1.54 中 Boost.Python 的一个已知问题吗? 任何帮助将不胜感激。


更新 #1:我再次尝试了 Boost 1.51 和 1.50,但出现了同样的问题,所以这不是 Boost 中的回归。

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

更新 #3: 使用 Process Monitor 我可以在它实际所在的 C:\Python27\libs\ 中不搜索 python27_d.lib:

3:35:28.0550683 PM  link.exe    10132   CreateFile  C:\franz\dev\appleseed\build\appleseed.python\python27_d.lib    NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0551846 PM  link.exe    10132   CreateFile  C:\franz\dev\boost_1_50_0\stage\lib\python27_d.lib  NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0552474 PM  link.exe    10132   CreateFile  C:\franz\dev\boost_1_50_0\stage\lib\Debug\python27_d.lib    PATH NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0553595 PM  link.exe    10132   CreateFile  C:\franz\dev\appleseed\build\appleseed.python\python27_d.lib    NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0556105 PM  link.exe    10132   CreateFile  C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\amd64\python27_d.lib NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0559637 PM  link.exe    10132   CreateFile  C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib\amd64\python27_d.lib  NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0560984 PM  link.exe    10132   CreateFile  C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x64\python27_d.lib  NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
3:35:28.0561741 PM  link.exe    10132   CreateFile  C:\franz\dev\appleseed\build\appleseed.python\python27_d.lib    NAME NOT FOUND  Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, AllocationSize: n/a

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

【问题讨论】:

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


【解决方案1】:

感谢这篇文章中的提示,我解决了这个问题:Visual C++ debug library naming convention

基本上,无论此库是否存在,Python 附带的头文件pyconfig.h(在C:\Python27\include\ 中)都会强制链接到调试版本中的python27_d.lib(通过#pragma comment() 指令)。

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

【讨论】:

  • 感谢您指出 boost 有一个特殊的包装器。
【解决方案2】:

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

如果您自己编译了 Python 的调试版本,您可以构建一个与您的 Python 调试版本链接的 Boost 调试版本。 (我用的是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2019-12-29
    • 2018-10-20
    • 2014-06-27
    • 2019-12-25
    相关资源
    最近更新 更多