cls*_*udt 9 c++ python boost boost-python
我正在尝试构建我的第一个Boost.Python示例.
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
class Hello {
public:
std::string greet() {
std::cout << "Hello World" << std::endl;
}
};
BOOST_PYTHON_MODULE(hello)
{
class_<Hello>("Hello")
.def("greet", &Hello::greet);
}
int main() {
std::cout << "Boost.Python Test" << std::endl;
Hello hello;
hello.greet();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:缺少Python开发标题,正如@cdhowie所指出的那样.我找到并包含了所需的头文件.现在链接器抱怨:
10:43:58 **** Build of configuration BoostPythonTest-DPar for project BoostPythonTest
****
make all
Building file: ../src/BoostPythonTest.cpp
Invoking: GCC C++ Compiler
/usr/local/bin/g++-4.7 -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I/usr/include -I/usr/local/Cellar/gcc/4.7.2/gcc/include/c++/4.7.2 -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/BoostPythonTest.d" -MT"src/BoostPythonTest.d" -o "src/BoostPythonTest.o" "../src/BoostPythonTest.cpp"
Finished building: ../src/BoostPythonTest.cpp
Building target: libBoostPythonTest-DPar.dylib
Invoking: MacOS X C++ Linker
/usr/local/bin/g++-4.7 -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config-3.3m -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib -L/usr/local/Cellar/boost/1.51.0/lib -std=c++11 -Xlinker -ldl -framework CoreFoundation -lpython3.3m -dynamiclib -o "libBoostPythonTest-DPar.dylib" ./src/BoostPythonTest.o -lpython3.3m -lboost_python-mt -lpython3.3
Undefined symbols for architecture x86_64:
"boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from:
_PyInit_hello in BoostPythonTest.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [libBoostPythonTest-DPar.dylib] Error 1
Run Code Online (Sandbox Code Playgroud)
我已经联系到了-lpython3.3m -lboost_python-mt -lpython3.3- 还缺少什么?
编辑:我想我已经链接到python3.3-config列出的所有内容.由于缺少符号,链接仍然不起作用.
Tan*_*ury 12
当发生此特定链接器错误时,通常是针对一个版本的Python构建应用程序的结果,例如Python 3.x头文件,而boost_python库是针对差异版本构建的,例如2.x.
在boost/python/module_init.hpp,init_module对Python 3.x构建时,该函数具有以下签名:
PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)());
Run Code Online (Sandbox Code Playgroud)
构建Python 2.x时的以下签名:
PyObject* boost::python::detail::init_module(char const* name, void(*)());
Run Code Online (Sandbox Code Playgroud)
由于可以在可以看到的实施,不仅功能之一将出现在Boost.Python库,.因此,如果Boost.Python库被链接,并且链接器只是抱怨无法解析3.x init_module函数,那么很可能Boost.Python库是针对Python 2.x构建的.版本,而应用程序代码是针对Python 3.x头文件构建的.您可以通过转储Boost.Python库的符号并检查init_module签名来验证这一点.
要解决此问题,请使用构建Boost.Python的相同版本的Python构建应用程序.在这种情况下,要么:
bootstrap通过使用--with-python参数显式提供Boost.Python将在此过程中构建的Python可执行文件.