使用 Boost::Python::Object 会导致链接器错误
Posted
技术标签:
【中文标题】使用 Boost::Python::Object 会导致链接器错误【英文标题】:Using Boost::Python::Object causes linker errors 【发布时间】:2013-08-05 12:38:18 【问题描述】:所以,我正在尝试将 Python 嵌入到 C++ 中。我已经走得很远了,并且已经能够做一些基本的事情,比如运行 Python 字符串。当我尝试使用 Boost::Python::Object 时,我开始收到这 4 个链接器错误。
我使用 BJAM 和 Boost 1.54.0 和 Python 2.7.5 构建了 boost。
Python Lib 构建命令:
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
【问题讨论】:
验证PythonTest.exe
是否与 Boost.Python 库链接。此外,您确实不想在使用 Boost.Python 时调用 Py_Finalize()
。
我仔细检查了,我正在链接 boost python。请问为什么我不应该使用 Py_Finalize()?是什么原因造成的?
Boost.Python 不支持安全调用Py_Finalize()
。简而言之,一些内部 Boost.Python 对象将在Py_Finalize()
期间保持活动状态,并且仅在 Boost.Python 卸载时尝试删除,导致对象尝试使用不存在的解释器进行删除。它在Embedding - Getting Started 部分中注明,并在TODO 中列出。
感谢您的帮助,但我仍然遇到这些错误。
符号可见性看起来好像PythonTest
期望 Boost.Python 库已经为动态链接而构建。在构建的 Boost.Python 库中检查符号可见性可能是值得的。如果未导出符号,则尝试在构建 PythonTest
时或在包含 boost/python.hpp
之前定义 BOOST_PYTHON_STATIC_LIB
来构建静态库。
【参考方案1】:
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_STATIC_LIB
)。
在构建示例代码时定义BOOST_PYTHON_STATIC_LIB
。
在示例代码之前中定义BOOST_PYTHON_STATIC_LIB
,包括boost/python.hpp
。
【讨论】:
以上是关于使用 Boost::Python::Object 会导致链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
从 boost::python::object 列表中获取单个元素,用于 python 例程