我有一个 C++ 库(我们称之为 mylib
),它编译为 /usr/local/lib
中的 libmylib.so
文件,并且我在 /usr/local/include
中名为 my lib
的目录中有一堆头文件。
现在我想做的事情(对于初学者)只是使用 SWIG 的一个头文件(它包含有关我的库提供的类的信息)来生成 mylib_wrap.cxx
文件然后编译它并将其链接到现有的 mylib.so
。这样我就可以在 Python 中实例化我的类。
这是正确的方法/想法吗?编译和链接命令会是什么样子(当然不完全是)?我正在尝试生成 Python 绑定(bind)。
最佳答案
我为你整理了一个完整的例子:
头文件:
(mylib.h)
class Foo {
};
void bar(const Foo&);
实现:
#include "mylib.h"
#include <iostream>
void bar(const Foo& f) {
std::cout << &f << std::endl;
}
编译库:
g++ -fPIC -Wall -Wextra -shared mylib.cc -o libmylib.so
SWIG interface to wrap the library:
%module mylib
// Make mylib_wrap.cxx include this header:
%{
#include "mylib.h"
%}
// Make SWIG look into this header:
%include "mylib.h"
编译 Python 模块:
swig -Wall -c++ -python mylib.i g++ -fPIC -Wall -Wextra -shared mylib_wrap.cxx -o _mylib.so -L。 -lmylib -I/usr/include/python2.7/-lpython2.7
请注意,我们将 Python 模块与库相关联。如果它不在当前目录中,则需要指定库路径。 SWIG 期望 Python 模块的 native 部分被称为 _module.so
运行
LD_LIBRARY_PATH=。 Python Python 2.7.2+(默认,2011 年 11 月 30 日,19:22:03) [GCC 4.6.2] 在 linux2 上 输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。 >>> 导入 mylib >>> i=mylib.Foo() >>> mylib.bar(i) 0x28cc100 >>> mylib.bar(i) 0x28cc100 >>> mylib.bar(mylib.Foo()) 0x28b3b10
这里我通过适当设置 LD_LIBRARY_PATH 来确保我们刚刚构建的共享对象位于库路径上。
关于c++ - SWIG 和 C++ 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126531/