15

我有一个 C++ 库(我们称之为mylib),它编译成libmylib.so文件,我在一个名为in/usr/local/lib的目录中有一堆头文件。my lib/usr/local/include

现在我想做的事情(对于初学者)只是使用 SWIG 的一个头文件(它包含有关我的库提供的类的信息)来生成mylib_wrap.cxx文件,然后编译它并将其链接到现有的mylib.so. 这样我就可以在 Python 中实例化我的类。

这是正确的方法/想法吗?编译和链接命令会是什么样子(当然不完全是)?我正在尝试生成 Python 绑定。

4

1 回答 1

33

我为你整理了一个完整的例子:

头文件:

(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 来确保我们刚刚构建的共享对象位于库路径上。

于 2012-04-12T15:28:52.797 回答