需要帮助开始使用Boost.Python
Need help getting started with 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;
}
编辑:正如@cdhowie指出的那样,Python开发头文件丢失了。我已经找到并包含了所需的头文件。现在链接器报错了:
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
我已经链接到-lpython3.3m -lboost_python-mt -lpython3.3
-还缺少什么?
python3.3-config
列出的所有内容。链接仍然不能工作,因为缺少符号。
当这个特定的链接器错误发生时,它通常是基于某个版本的Python构建应用程序的结果,比如Python 3。而boost_python
库是针对不同版本构建的,例如2.x.
在boost/python/module_init.hpp
中,init_module
函数在针对Python 3.x构建时具有以下签名:
PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)());
和以下签名在Python 2.x上构建时:
PyObject* boost::python::detail::init_module(char const* name, void(*)());
在实现中可以看到,只有一个函数会出现在Boost中。Python库。因此,给定Boost。Python库正在被链接进来,而链接器只是抱怨无法解析3。x init_module
函数,那么很有可能Boost。Python库是基于Python 2构建的。而应用程序代码是基于Python 3构建的。X头文件。您可以通过转储Boost来验证这一点。Python库的符号,并检查init_module
签名。
要解决这个问题,使用Boost使用的Python版本来构建应用程序。Python诞生了。在本例中,要么:
- 使用Python 2构建应用程序。x头文件和Python 2的链接。x库。
- 建立刺激。Python对Python 3.x。本文档描述了构建Boost的步骤,并详细介绍了Boost. python。可能需要显式地提供Python可执行文件。Python将在
bootstrap
进程中使用--with-python
参数进行构建。
您错过了Python开发头文件。您的Linux发行版应该有一个相应的包。(例如,Debian或Ubuntu上的python-dev
)
您正在构建一个共享库,因为这就是二进制Python模块。为此,您需要-shared或-dynamic(请查看文档),并且不应该有main()函数。
进一步,如果这没有帮助,你仍然有链接器错误,使用"objdump -T——demangle/path/to/lib"来找出一个库包含哪些符号以及它是否有你需要的那些符号。还要检查"ldd"的输出,它列出了依赖的共享对象。这应该会给你一个链接哪个库的提示。
在我的系统中,我也有一个名为"python-config"answers"python2.7-config"的程序。检查是否有类似的东西,因为这个脚本知道至少要为python链接哪些库。一个类似的工具是pkg-config,它更通用,也可能为boost提供信息。
不确定这是否是这样做的方式,但似乎PY_VERSION_HEX设置错误。如果
#define PY_VERSION_HEX 0x03300000
在包含boost之前。在你的BoostPythonTest.cpp?
您还必须与Boost链接。系统,以及链接器提到的任何其他库。也可以尝试其他编译器,比如XCode附带的Clang(https://svn.boost.org/trac/boost/ticket/7536) (XCode 4.5中最新的Clang位置)。另外,试着发布你的makefile。另一种尝试是使用bjam/b2而不是make.
- 我应该包含什么来制作 boost.python 扩展?
- C++ 和 Boost.Python - 如何将变量公开给 python 并在循环中更新它?
- 如何将来自 Boost.Python 的map_indexing_suite与自定义而不是标准对象一起使用?
- Boost Python Numpy - 要初始化的未定义引用
- Boost.Python :C++模板类型匹配的嵌套命名空间
- Boost.Python 列出了所有公开的类和属性
- Boost.Python 在静态库方面失败
- 在cpp中使用boost-python的python代码是否进行动态内存分配
- Boost.Python 和导入 dll,"The specified module could not be found"
- 无法将__str__特殊方法与Boost::Python接口
- 编译时出现Boost.python链接错误
- 使用 Boost/Python 的未定义符号 - 复杂
- Boost.Python 和C++导入到 Python 3 时编译库错误
- 两个并发的 Python 进程可以在 Boost Python 中运行吗?
- 通过 Boost Python 将 Python 函数转换为 C++,用作回调
- 编译在 Python 代码内部调用的 C++ 代码时出错,使用 Boost Python
- Boost.Python.ArgumentError: World.set(World, str) 中的 Python
- 使用 boost python 从 c++ 为 python 中的类成员变量赋值
- Boost Python 不断链接 Python27 库
- 使用 python3 为 msvc 构建 boost python - 链接器错误