4

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

升级到 Boost 1.54、CMake 2.8.12 和 Python 2.7.5(所有三个都来自稍早的次要版本)后,我的项目的 Python 绑定不再在调试配置中链接(它们在发布中链接正常)。我正在使用 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:使用进程监视器我可以不搜索 python27_d.lib 的C:\Python27\libs\实际位置:

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++ 调试库命名约定

4

2 回答 2

9

我解决了这个问题,感谢这篇文章中的提示:Visual C++ 调试库命名约定

基本上,无论这个库是否存在pyconfig.h,Python 附带的头文件(in C:\Python27\include\)都会强制链接到python27_d.libDebug 构建(通过指令)。#pragma comment()

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

于 2013-11-01T16:40:40.990 回答
1

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

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

首先创建一个文本文件,例如my_config.bjamconatining:

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还应该在编译程序的调试版本时进行定义。

于 2015-08-14T09:28:48.520 回答