2013-08-05 2 views
1

Итак, я пытаюсь встроить Python в C++. Я довольно далеко зашел и смог сделать основные вещи, например, запустить строки Python. Как только я попытался использовать Boost :: Python :: Object, я начал получать эти 4 ошибки компоновщика.Использование Boost :: Python :: Object вызывает ошибки компоновщика

Я построил boost с помощью BJAM с Boost 1.54.0 и Python 2.7.5.

Python Lib сборки Команды:

bootstrap 
.\b2 toolset=msvc-10.0 --with-python 

Minimal Пример кода:

#include <boost/python.hpp> 
#include <iostream> 

int main(int, char **) 
{ 
    Py_Initialize(); 
    PyRun_SimpleString("import Entity"); 

    boost::python::object main_module = boost::python::import("__main__"); 
    boost::python::object main_namespace = main_module.attr("__dict__"); 

    Py_Finalize(); 

    std::cin.get(); 
    return 0; 
} 

компоновщика ошибки:

1>PythonTest.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::python::api::object __cdecl boost::python::import(class boost::python::str)" ([email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) referenced in function _main 
1>PythonTest.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall boost::python::detail::str_base::str_base(char const *)" ([email protected]@[email protected]@@[email protected]@Z) referenced in function "public: __thiscall boost::python::str::str(char const *)" ([email protected]@[email protected]@[email protected]@Z) 
1>E:\Dev\PythonTest\Debug\PythonTest.exe : fatal error LNK1120: 2 unresolved externals 
+1

Убедитесь, что 'PythonTest.exe' связан с библиотекой Boost.Python. Кроме того, вы ** не ** хотите вызывать 'Py_Finalize()' при использовании Boost.Python. –

+0

Я дважды проверял, и я связываюсь с boost python. Могу ли я спросить, почему я не должен использовать Py_Finalize()? Что это значит? – user947871

+2

Boost.Python не поддерживает безопасный вызов 'Py_Finalize()'. Короче говоря, некоторые внутренние объекты Boost.Python останутся в живых во время 'Py_Finalize()' и будут пытаться удаляться только при выгрузке Boost.Python, в результате чего объекты будут пытаться удалить с несуществующим интерпретатором. Это отмечено в разделе [Вложение - Начало работы] (http://www.boost.org/doc/libs/1_54_0/libs/python/doc/tutorial/doc/html/python/embedding.html) и перечислено в [TODO] (http://www.boost.org/doc/libs/1_54_0/libs/python/todo.html#pyfinalize-safety). –

ответ

2

Boost.Python может быть создан для статической или динамической компоновки. Это контролируется BOOST_PYTHON_STATIC_LIB, определяемым или не определяемым в процессе сборки. Кажется, что boost mailing list указывает, что эта дефиниция и встроенные типы являются результатом некоторой путаницы.

Когда BOOST_PYTHON_STATIC_LIB не определен, тогда Boost.Python предполагает динамическую связь. В результате Boost.Python украшает видимость символов для dllimport and dllexport. На основании ошибки компоновщика код примера ожидал импортировать функцию boost::python::import() во время соединения. Если вы подтвердили, что библиотека Boost.Python связана, проблема, скорее всего, является результатом создания Boost.Python для статической привязки, где функции не оформлены для экспорта. Чтобы решить эту проблему, выполните одно из следующих действий:

  • Построить Boost.Python для динамического связывания (то есть убедиться, что BOOST_PYTHON_STATIC_LIB не определена).
  • Определить BOOST_PYTHON_STATIC_LIB при построении кода примера.
  • Определить BOOST_PYTHON_STATIC_LIB в примере кода до включая boost/python.hpp.
Смежные вопросы