C++ 需要帮助开始使用Boost.Python吗
我正在尝试构建我的第一个Boost.Python示例C++ 需要帮助开始使用Boost.Python吗,c++,python,boost,boost-python,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_PY
#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;
}
我已经链接到了-lpython3.3m-lboost\u python-mt-lpython3.3
-还缺少什么
编辑:我想我已经链接到了
python3.3-config
列出的所有内容。由于缺少符号,链接仍然无法工作。您缺少Python开发标题。您的Linux发行版应该为它们提供一个包。(例如,Debian或Ubuntu上的python dev)您正在构建一个共享库,因为这就是二进制python模块。为此,您需要-shared或-dynamic(检查文档),并且不应该有main()函数
此外,如果这没有帮助,并且仍然存在链接器错误,请使用“objdump-t--demangle/path/to/lib”找出库中包含哪些符号,以及库中是否包含您需要的符号。还要检查“ldd”的输出,其中列出了相关的共享对象。这将提示您链接哪个库
在我的系统上,我还有一个名为“python配置”和“python2.7-config”的程序。检查是否有类似的内容,因为该脚本知道至少要为python链接哪些库。类似的工具是pkg config,它更通用,也可能为boost提供信息。当发生此特定链接器错误时,它通常是针对一个版本的Python(如Python 3.x头文件)构建应用程序的结果,而
boost_Python
库是针对不同版本构建的,比如2.x
在中,根据Python 3.x构建时,init_模块
函数具有以下特征:
PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)());
在构建Python2.x时使用以下签名:
PyObject* boost::python::detail::init_module(char const* name, void(*)());
从中可以看出,Boost.Python库中只存在一个函数。因此,考虑到Boost.Python库正在链接,而链接器只是抱怨无法解析3.xinit_module
函数,那么Boost.Python库很可能是针对Python2.x版本构建的,而应用程序代码是针对Python3.x头文件构建的。您可以通过转储Boost.Python库的符号并检查init_模块
签名来验证这一点
要解决这个问题,请使用构建Boost.Python的相同版本的Python构建应用程序。在这种情况下,可以:
- 使用Python2.x头文件和针对Python2.x库的链接构建应用程序
- 针对Python3.x构建Boost.Python。文档描述了构建Boost的步骤,文档详细介绍了Boost.Python。可能需要使用
参数显式提供Boost.Python将在--with Python
引导过程中构建的Python可执行文件
- 您还必须链接Boost.System以及链接器提到的任何其他库。另外,请尝试其他编译器,例如XCode()附带的Clang()。另外,尝试发布您的makefile。另一种尝试是使用bjam/b2而不是make。不确定这是否是执行此操作的方法,但似乎PY\u版本的十六进制设置错误。
如果你
#define PY_VERSION_HEX 0x03300000
在将boost.python头包含在boostpythont.cpp中之前?感谢您指出错误。但是我在OSX上,知道如何获取标题吗?Homebrew似乎没有一个公式
python dev
@cls我不使用OS X,所以我不能在那里提供任何建议。也许其他人可以找到.Headers,但存在链接器问题,我希望示例能够正常工作。python3.3-config
为我提供了一些路径和标记,我已经添加了这些路径和标记,但没有任何效果(请参见上面的调用)otool
(这显然是OSX相当于objdump
)给了我例如$otool-T libboost\u python-mt.dylib libboost\u python-mt.dylib:Table of contents(0个条目)模块索引符号索引
ldd
在OSX上似乎不存在。我相信您正确诊断了问题。我现在正试图针对Python3.3构建Boost.Python。当我尝试构建Boost.Python时,我得到了gcc.link.dll../../../../../bin.v2/libs/python/build/gcc-4.2.1/debug/libboost_python.dylib ld:警告:找不到选项'-L/usr/local/cillar/python3/3.3.0/Frameworks/python.Frameworks/Versions/3.3/config'的目录ld:未知选项:-R collect2:ld返回1退出状态
这里发生了什么事?@cls:如果使用苹果版本的GCC工具链,然后尝试将工具集指定为darwin
,而不是GCC
。这是一个注释,不是答案。
#define PY_VERSION_HEX 0x03300000