Загадочная зависимость Boost.Python 1.54 (отладочная сборка) от Python27.lib в Windows

Должно быть, я совершаю какую-то очевидную ошибку, но после нескольких часов борьбы я не могу добиться дальнейшего прогресса:

После обновления до 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.Python в Boost 1.54? Любая помощь будет принята с благодарностью.


Обновление № 1: я попытался снова с Boost 1.51 и 1.50, и возникает та же проблема, так что это не регрессия в Boost.

Обновление № 2: я удалил отладочную версию библиотеки Python (python27_d.lib) из моей установки Python, вернувшись к стандартной установке 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 я мог бы, чтобы 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++

2 ответа

Решение

Я исправил проблему благодаря подсказкам из этого поста: Соглашение об именах библиотек отладки Visual C++.

В основном, заголовочный файл pyconfig.h который поставляется с Python (в C:\Python27\include\) заставляет ссылаться на python27_d.lib в сборке отладки (через #pragma comment() директива), независимо от того, существует эта библиотека или нет.

Хитрость заключается в том, чтобы никогда не включать Python.h напрямую, но вместо этого включить оболочку Boost для этого файла, boost/python/detail/wrap_python.hpp который заботится об отключении нарушителя #pragma comment() директивы.

В том числе 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 также при компиляции отладочной версии вашей программы.

Другие вопросы по тегам