我有一个C++库(我们将其称为mylib
)编译为libmylib.so
中的/usr/local/lib
文件,并且我在my lib
中一个名为/usr/local/include
的目录中有一堆头文件。
现在,我想做的(对于初学者而言)只是使用带有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-共享的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)
linux2上的[GCC 4.6.2]
键入“帮助”,“版权”,“信用”或“许可证”以获取更多信息。
>>>导入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/