使用Boost::Python::Object会导致链接器错误 所以,我正试图将Python嵌入C++中。我在这方面已经取得了相当大的进步,并且能够做一些基本的事情,比如运行Python的字符串。当我尝试使用Boost::Python::Object时,我开始出现以下4个链接器错误
我使用BJAM和boost1.54.0以及python2.7.5构建了boost Python库构建命令:使用Boost::Python::Object会导致链接器错误 所以,我正试图将Python嵌入C++中。我在这方面已经取得了相当大的进步,并且能够做一些基本的事情,比如运行Python的字符串。当我尝试使用Boost::Python::Object时,我开始出现以下4个链接器错误,c++,boost,scripting,boost-python,python-embedding,C++,Boost,Scripting,Boost Python,Python Embedding,我使用BJAM和boost1.54.0以及python2.7.5构建了boost Python库构建命令: bootstrap .\b2 toolset=msvc-10.0 --with-python #include <boost/python.hpp> #include <iostream> int main(int, char **) { Py_Initialize(); PyRun_SimpleString("import Entity");
bootstrap
.\b2 toolset=msvc-10.0 --with-python
#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)" (__imp_?import@python@boost@@YA?AVobject@api@12@Vstr@12@@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 *)" (__imp_??0str_base@detail@python@boost@@IAE@PBD@Z) referenced in function "public: __thiscall boost::python::str::str(char const *)" (??0str@python@boost@@QAE@PBD@Z)
1>E:\Dev\PythonTest\Debug\PythonTest.exe : fatal error LNK1120: 2 unresolved externals
最小代码示例:
bootstrap
.\b2 toolset=msvc-10.0 --with-python
#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)" (__imp_?import@python@boost@@YA?AVobject@api@12@Vstr@12@@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 *)" (__imp_??0str_base@detail@python@boost@@IAE@PBD@Z) referenced in function "public: __thiscall boost::python::str::str(char const *)" (??0str@python@boost@@QAE@PBD@Z)
1>E:\Dev\PythonTest\Debug\PythonTest.exe : fatal error LNK1120: 2 unresolved externals
Python可以为静态或动态链接而构建。这是由在构建过程中定义或未定义的
BOOST\u PYTHON\u STATIC\u LIB
控制的。这似乎表明这个定义和构建类型是一些混淆的结果
如果未定义BOOST\u PYTHON\u STATIC\u LIB
,则BOOST.PYTHON采用动态链接。因此,Boost.Python装饰了的符号可见性。基于链接器错误,示例代码希望在链接期间导入boost::python::import()
函数。如果您已经验证了Boost.Python库正在被链接,那么问题很可能是Boost.Python为静态链接而构建的结果,在静态链接中,函数没有被修饰以进行导出。要解决此问题,请执行以下操作之一:
- 为动态链接构建Boost.Python(即确保未定义
)Boost\u Python\u STATIC\u LIB
- 在构建示例代码时定义
BOOST\u PYTHON\u STATIC\u LIB
- 在包含
之前,在示例代码中定义BOOST/PYTHON.hpp
BOOST\u PYTHON\u STATIC\u LIB
BOOST\u PYTHON\u STATIC\u LIB
控制的。这似乎表明这个定义和构建类型是一些混淆的结果
如果未定义BOOST\u PYTHON\u STATIC\u LIB
,则BOOST.PYTHON采用动态链接。因此,Boost.Python装饰了的符号可见性。基于链接器错误,示例代码希望在链接期间导入boost::python::import()
函数。如果您已经验证了Boost.Python库正在被链接,那么问题很可能是Boost.Python为静态链接而构建的结果,在静态链接中,函数没有被修饰以进行导出。要解决此问题,请执行以下操作之一:
- 为动态链接构建Boost.Python(即确保未定义
)Boost\u Python\u STATIC\u LIB
- 在构建示例代码时定义
BOOST\u PYTHON\u STATIC\u LIB
- 在包含
之前,在示例代码中定义BOOST/PYTHON.hpp
BOOST\u PYTHON\u STATIC\u LIB
PythonTest.exe
是否链接到Boost.Python库。另外,在使用Boost.Python时,您不想调用Py\u Finalize()
。我仔细检查了一下,并且正在链接Boost-Python。请问为什么我不应该使用Py_Finalize()?这会导致什么?Boost.Python不支持安全调用Py\u Finalize()
。简而言之,一些内部Boost.Python对象将在Py_Finalize()
期间保持活动状态,并且仅在Boost.Python卸载时尝试删除,从而导致对象尝试使用不存在的解释器删除。这一点在本节中有所说明,并在中列出。我感谢您的帮助,但我仍然会遇到这些错误。符号可见性看起来像是PythonTest
希望Boost.Python库是为动态链接而构建的。在构建的Boost.Python库中检查符号可见性可能是值得的。如果未导出符号,则在构建PythonTest
或包含BOOST/PYTHON.hpp
之前,通过定义BOOST\u PYTHON\u static\u LIB
尝试为静态库构建。验证PythonTest.exe
是否链接到BOOST.PYTHON库。另外,在使用Boost.Python时,您不想调用Py\u Finalize()
。我仔细检查了一下,并且正在链接Boost-Python。请问为什么我不应该使用Py_Finalize()?这会导致什么?Boost.Python不支持安全调用Py\u Finalize()
。简而言之,一些内部Boost.Python对象将在Py_Finalize()
期间保持活动状态,并且仅在Boost.Python卸载时尝试删除,从而导致对象尝试使用不存在的解释器删除。这一点在本节中有所说明,并在中列出。我感谢您的帮助,但我仍然会遇到这些错误。符号可见性看起来像是PythonTest
希望Boost.Python库是为动态链接而构建的。在构建的Boost.Python库中检查符号可见性可能是值得的。如果未导出符号,则在构建PythonTest
或包含BOOST/PYTHON.hpp
之前,通过定义BOOST\u PYTHON\u static\u LIB
尝试为静态库构建。