我为你整理了一个完整的例子:
头文件:
(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 接口:
%module mylib
// Make mylib_wrap.cxx include this header:
%{
#include "mylib.h"
%}
// Make SWIG look into this header:
%include "mylib.h"
编译 Python 模块:
痛饮 -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 模块的本机部分被称为 _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 来确保我们刚刚构建的共享对象位于库路径上。