SWIG和C++共享库

15
我有一个C++库(我们称之为mylib),它被编译成/usr/local/lib目录下的libmylib.so文件,同时我在/usr/local/include目录下有一个名为my lib的目录,其中包含一堆头文件。
现在我想要做的事情(先从简单的开始)是使用其中一个头文件(它包含关于我的库提供的某个类的信息)与SWIG一起生成mylib_wrap.cxx文件,然后将其编译并链接到现有的mylib.so文件上。这样我就可以在Python中实例化我的类了。
这是否是正确的方法/想法?编译和链接命令会是什么样子(当然不是准确的)?我正在尝试生成Python绑定。
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模块:

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模块的本地部分被称为_module.so。

运行

LD_LIBRARY_PATH=. python                                                 
Python 2.7.2+ (default, Nov 30 2011, 19:22:03) 
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mylib
>>> i=mylib.Foo()
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(mylib.Foo())
0x28b3b10

在这里,我通过适当设置LD_LIBRARY_PATH来确保我们刚刚构建的共享对象位于库路径上。


当我在Ubuntu上编译时,发现我只需要使用mylib而不是-lmylib - iggy12345

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接