如何在Python中编译、创建共享库和导入c++ boost模块
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而不是form还是没有给它另一个名字?对一些人来说,我的问题是如何编译,构建共享库并将其包含在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
并检查库的路径是否与用于构建模块的路径相同。
相关文章:
- 尝试导入pybind-opencv模块时出现libgtk错误
- 导入库可以跨dll版本工作吗
- 建议在运行时将带有类实例的列表从c++导入qml
- 导入/导出变量时出错
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 将QT项目导入Visual Studio 2019会给我带来很多LNK2001错误
- 是否可以将函数导入命名空间,但不能导出它?
- 如何将 CLion C++ 项目导入 Visual Studio?
- Python 3.8 不能与 Pybind11 一起导入 [Windows]
- 无法将标准库导入本机 android 项目中的头文件
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 在 python 模块中导入子模块时PyImport_Import失败
- 将 C# DLL 导入 C++ 以用于 JNI
- 使用 QSslCertificate 在 Qt 中正确导入 pkcs12
- 在从Qt调用的Python脚本中导入OpenCV崩溃
- 编译boost_python扩展无法在 python 2.7 中导入
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- Dll在同一解决方案中从 c# 项目导入到 c++ 项目
- C++20 使用 Visual Studio 编译模块:不编译或导入 ixx 文件
- 我可以将cocos项目导入虚幻4吗?