Фатальная ошибка boost 1.53 python LNK1104 boost_python-vc110-mt-gd-1_53.lib
Я пытаюсь (в течение нескольких дней) создать DLL, сгенерированную из кода C++ с помощью boost/python для использования python. Я студент из Германии и до сих пор имел дело главным образом с Java (раньше я писал кое-что из OpenGL и gimp filter в C++). Так что заранее извините за плохой английский или ошибки C++ для начинающих. Я имею в виду, что программирование на Java действительно намного удобнее по сравнению с C++. Но хватит стычки.
Ошибка:
LINK : fatal error LNK1104: File "boost_python-vc110-mt-gd-1_53.lib" could not be openend
Мои пресеты:
с использованием MS Visual Studio 2012 (11.0)
-использование boost_1_53_0
-использование python2.7 (я слышал, 3.3 может вызвать некоторые проблемы)
Что я сделал:
Установил python и добавил его в PATH. Затем создал новый пустой проект в VS и файл класса "Test.cpp" со следующим содержимым, как описано на странице учебника по бусту:
char const* greet()
{
return "hello world";
}
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(Test)
{
using namespace boost::python
def("greet", greet);
}
Затем появилась новая часть для меня, в VS Project Properties:
Свойства конфигурации> Общие> Тип конфигурации> Динамическая библиотека (.dll)
C / C++> Общие> Дополнительные каталоги> C:[..]\boost_1_53_0
Линкер> Общие> Дополнительные каталоги библиотек> C:[..]boost_1_53_0\stage\lib
Из ошибки я предполагаю, что я сделал что-то не так с Linker или Включить. Я также изменил Linker > General > Additional Library Directorys на boost_1_53_0\libs, потому что я не был уверен, но произошла та же ошибка. И да, я правильно включил python. Я также не уверен, если я должен положить что-то еще, кроме python, в Linker > Input для boost.
Затем я создаю boost с помощью bjam без параметров, кроме msvc-11.0, чтобы быть уверенным, что у меня есть все, что мне нужно (хотя я читал, что boost/python не нуждается в дополнительной сборке), и все равно получаю ту же ошибку. Кто-нибудь может мне помочь? Я хотел бы получить пошаговое описание того, что делать. Я действительно отчаиваюсь из-за этого.
Кстати, у меня была та же ошибка, что и у этого парня, за несколько дней до того, как ошибка компоновщика LNK1104 с 'libboost_filesystem-vc100-mt-s-1_49.lib' затем перестала работать над ним, и когда я начал снова, я получил свою совершенно новую ошибку (я не могу сказать вам, как это произошло).
4 ответа
Обратите внимание, что я очень благодарен за ваши попытки, но ни один из ваших ответов не помог. Затем один из студентов дал мне подсказку о правильном ответе, и некоторые шаги действительно просты, другие я не понимаю, но сейчас это работает.
Первая проблема заключалась в следующем: новый буст 1.53.0 не работает с Python27 и старше. Затем я связал его с Python33 и удалил ошибку сборки.
Но, конечно, версия сборки не работала без ошибок. Когда я попытался запустить свой helloboost.py, который импортирует из.pyd, созданного VisualStudio, и вызывает метод greet, произошла следующая ошибка:
ImportError: DLL load failed: The specified module could not be found.
Когда я проверил hello_ext.pyd с помощью обходчика зависимостей и дико вставленной копии, я обнаружил, что для этого требуется boost_python-vc110-mt-gd-1_53.dll (вероятно, в зависимости от того, что вам нужно, и который был собран с помощью bjam ранее) в том же папка. Это сработало тогда. Может быть, кто-то может объяснить, почему нигде не объяснили, что мне нужен этот dll в той же папке, что и pyd (или я что-то упустил? Это только потому, что я раньше ошибался?)
Во всяком случае, я очень рад, что это работает сейчас и надеюсь, что это помогает другим людям.
Так как он ищет статическую библиотеку, добавьте BOOST_PYTHON_STATIC_LIB
флаг, перейдите в свойства VS -> препроцессор -> определение процессора, добавить BOOST_PYTHON_STATIC_LIB
флаг.
Вам необходимо создать файл "user-config.jam", который указывает, где можно найти заголовки и библиотеки python с помощью Boost.Build. Вы можете создать его в своем каталоге boost_1_53_0/ со следующим содержимым:
# Configure specific Python version.
using python : 2.7
: C:/Python27/python.exe
: C:/Python27/include #directory that contains pyconfig.h
: C:/Python27/libs #directory that contains python27.lib
: <toolset>msvc ;
Затем из этого каталога boost_1_53_0/ вам нужно вызвать b2 следующим образом, чтобы собрать недостающую библиотеку:
b2 toolset=msvc-11.0 --with-python variant=debug runtime-debugging=on link=shared --user-config=user-config.jam stage
(хотя я бы порекомендовал b2 toolset=msvc-11.0 --with-python --user-config=user-config.jam --build-type=complete stage
так что вы можете получить за один шаг все конфигурации, которые могут вам понадобиться в будущем)
Когда у вас есть библиотеки, вам нужно добавить каталоги в Visual Studio (как для повышения, так и для Python).
После того, как вы успешно построили модуль, вам нужно переименовать его в Test.pyd
(точное имя, которое вы использовали в BOOST_PYTHON_MODULE
, Если у вас есть библиотеки python и Boost.Python в вашем PATH или в вашем текущем каталоге, вы сможете использовать сценарий в учебнике:
import Test
print Test.greet()
и получить знакомый "привет мир".
Вы, вероятно, уже разобрались с этим - однако:
Когда.exe ищет.dll для загрузки, путь не указан. Поэтому.dll должен быть в пути поиска файла.
Кроме того: я пытался собрать 1.49 библиотеки для Visual Studio 2013 - и продолжал получать ошибку LNK из моего проекта. Я не знаю, кто предложил это для stackru, но кто-то дал мне идею скопировать систему сборки из более поздней версии, которая знает, как создавать.libs для более новых сред. (благодарю вас)
Мне пришлось скопировать систему Boost-сборки из 1.58 после запуска начальной загрузки в 1.58, скопировать b2, bjam и boost-build.jam в более ранний корневой каталог Boost, чтобы заменить там файлы с такими же именами. Также вам нужно будет скопировать более позднюю папку tools\build для поддержки системы сборки.
Отметив здесь, в надежде, что это может помочь кому-то еще в подобной ситуации, в которой я оказался.