使用Boost::Python::Object会导致链接器错误

Using Boost::Python::Object causes linker errors

本文关键字:链接 错误 Boost Python Object 使用      更新时间:2023-10-16

因此,我正试图将Python嵌入C++中。我已经走得相当远了,并且能够做一些基本的事情,比如运行Python的字符串。当我尝试使用Boost::Python::Object时,我就开始得到这4个链接器错误。

我使用带有boost 1.54.0和Python 2.7.5的BJAM构建了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");
    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:DevPythonTestDebugPythonTest.exe : fatal error LNK1120: 2 unresolved externals

Boost.Python可以用于静态或动态链接。这是由在构建过程中定义或未定义的BOOST_PYTHON_STATIC_LIB控制的。boost邮件列表似乎表明,这种定义和构建类型是一些混乱的结果。

当未定义BOOST_PYTHON_STATIC_LIB时,Boost.Python将采用动态链接。因此,Boost.Python修饰了dllimport和dllexport的符号可见性。基于链接器错误,示例代码希望在链接期间导入boost::python::import()函数。如果您已经验证了Boost.Python库正在链接,那么问题很可能是Boost.Pathon是为静态链接而构建的,其中函数没有为导出而进行修饰。要解决此问题,请执行以下操作之一:

  • 为动态链接构建Boost.Python(即确保未定义BOOST_PYTHON_STATIC_LIB
  • 在构建示例代码时定义BOOST_PYTHON_STATIC_LIB
  • 在之前的示例代码中定义BOOST_PYTHON_STATIC_LIB,包括boost/python.hpp