![](/img/trans.png)
[英]How to compile a c++ program into shared library to be imported into Python?
[英]How to compile, create shared library, and import c++ boost module in Python
我在网上看到大量有关如何为Python编译c ++模块的信息。 但是问题是,实际上任何程序员都有自己的编译方式,自己的标志列表和其他技巧。 因此,考虑到各种各样的技巧,我无法决定应该使用哪种方法,此外还有其他一些问题。 这是我尝试的:
// part of main.cpp file
....
BOOST_PYTHON_MODULE( orm ){
class_<ORM>( "ORM",
// other code goes here
}
我的第一个问题是,从长远来看,我将如何在Python中包含此模块? 我应该这样做吗:
import orm
还是取决于编译过程中创建的目标文件的名称?
我的第二个问题是如何编译模块并将其准备用于Python? 现在我这样做:
$ g++ -I /usr/include/python2.7 -fpic -c -o main.o main.cpp
似乎应该再做一个额外的步骤来创建共享库,但是我不确定如何做。 顺便说一句,我可以将我的目标文件命名为main.o而不是orm还是没有给它起另一个名字吗? 在某种程度上,我的问题是如何编译,构建共享库并将其包含在Python中(我希望可以在其中使用import orm
)?
编辑
如果我这样做:
// part of main.cpp
BOOST_PYTHON_MODULE( orm ){
class_<ORM>( "ORM",
// other code goes here
}
和
$ g++ -I /usr/include/python2.7 -fpic -c -o orm.os main.cpp
$ g++ -o orm.so -shared orm.os -lboost_python -lpython2.7
然后在尝试将其导入python时出现错误:
>>> import orm
...
ImportError: ./orm.so: undefined symbol: _ZNO3.....
那么,我在做什么错呢? 我希望世界上至少有一个知道答案的人。
编辑
我再次尝试:
$ g++ -fpic -shared -o orm.so main.cpp `pkg-config --cflags --libs python` -I /usr/include/python2.7
当我再做一次时:
>>> import orm
我仍然得到相同的错误undefined symbol blablabla
。 希望有人知道正确做事的神圣知识。
根据要求提供了一个小示例:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
#pragma GCC diagnostic pop
namespace python = boost::python;
class ORM
{
public:
void foo(){std::cout << "foo" << std::endl;}
};
BOOST_PYTHON_MODULE(orm)
{
python::class_<ORM>("ORM")
.def("foo", &ORM::foo)
;
}
构建命令行:
g++ -I /usr/include/python2.7 -fpic -c -o orm.o orm.cpp
g++ -o orm.so -shared orm.o -lboost_python -lpython2.7
运行python模块:
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import orm
>>> o = orm.ORM()
>>> o.foo()
foo
>>>
如果尝试导入模块返回undefined symbol
错误,则很可能在运行时使用的库版本与用于构建python模块的库版本不同。 您可以使用ldd
打印共享库依赖项,以查看一切是否正常,例如: ldd orm.so
并检查库的路径是否与用于构建模块的路径相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.