Общая библиотека SWIG и С++
У меня есть библиотека С++ (пусть она называет ее mylib
), которая компилируется в libmylib.so
файл в /usr/local/lib
, и у меня есть куча файлов заголовков в каталоге с именем my lib
в /usr/local/include
.
Теперь то, что я хотел сделать (для начинающих), просто использует один из файлов заголовков (содержит информацию о классе, который предлагает моя библиотека) с SWIG, чтобы сгенерировать файл mylib_wrap.cxx
, а затем скомпилировать его и связать с ним против существующего mylib.so
. Так что я могу экземпляр моего класса в Python.
Это правильный подход/идея? Как выглядит команда компиляции и компоновки (не совсем точно)? Я пытаюсь создать привязку Python.
Ответы
Ответ 1
Я собрал для вас полный пример:
Файл заголовка:
(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
Run
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.
Ответ 2
Ну, "правильный подход" - это RTFM: http://www.swig.org/tutorial.html;)
вам нужно будет создать файл mylib.i, чтобы выставить код, который вы хотите получить на python, а затем вам просто нужно его скомпилировать.
Вы попробовали? вы получили какие-либо ошибки/проблемы?
edit: подробности из учебника
Файл C
/* 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);
}
Интерфейс SWIG интерфейса .i
/* 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();
Compile
% 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'
>>>