我有一个C ++库(我们称之为mylib
),它编译为libmylib.so
中的/usr/local/lib
文件,我在一个名为my lib
的目录中有一堆头文件在/usr/local/include
。
现在我想做的事情(对于初学者)只是使用其中一个头文件(它包含我的库提供的类的信息)和SWIG生成mylib_wrap.cxx
文件,然后编译它将其与现有mylib.so
相关联。这样我就可以在Python中实现我的类了。
这是正确的方法/想法吗?编译和链接命令将如何(当然不完全正确)?我正在尝试生成Python绑定。
答案 0 :(得分:31)
我为你准备了一个完整的例子:
(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
%module mylib
// Make mylib_wrap.cxx include this header:
%{
#include "mylib.h"
%}
// Make SWIG look into this header:
%include "mylib.h"
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来确保我们刚刚构建的共享对象在库路径上。
答案 1 :(得分:-2)
嗯,“正确的方法”是RTFM:http://www.swig.org/tutorial.html;)
你必须创建mylib.i文件来公开你想要在python中获得的代码,然后你只需要编译它。
你尝试过吗?你有任何错误/问题吗?编辑:教程中的详细信息
/* File : example.c */
#include <time.h>
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y) {
return (x%y);
}
char *get_time()
{
time_t ltime;
time(<ime);
return ctime(<ime);
}
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
% swig -python example.i
% gcc -c example.c example_wrap.c -I/usr/local/include/python2.*
% ld -shared example.o example_wrap.o -o _example.so
>>> import example
>>> example.fact(5)
120
>>> example.my_mod(7,3)
1
>>> example.get_time()
'Sun Feb 11 23:01:07 1996'
>>>