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

时间:2013-08-05 12:38:19

标签: c++ boost scripting boost-python python-embedding

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

我使用BJAM和Boost 1.54.0以及Python 2.7.5构建了boost。

Python Lib Build命令:

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

1 个答案:

答案 0 :(得分:3)

可以为静态或动态链接构建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