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