Compilando um wrapper SWIG Python para uma biblioteca estática?
Esta é uma pergunta noob. Estou tentando aprender como usar o SWIG para criar uma interface python para uma biblioteca C ++. A biblioteca é uma biblioteca proprietária de terceiros; trata-me na forma de um arquivo de cabeçalho (foo.h) e um arquivo estático (libfoo.a).
Para simplificar, criei um exemplo que acho que tem a mesma patologia. Mesmo mensagens de erro de qualquer maneira.
/* foo.hpp */
class TC {
public:
TC();
int i;
private:
};
Para referência, aqui está foo.c. Eu só tenho os arquivos de cabeçalho e archive da biblioteca real de terceiros.
/*foo.cxx */
#include "foo.hpp"
TC::TC() {
i = 0;
}
Eu criei essa biblioteca digitandog++ -c foo.cxx && ar rcs libfoo.a foo.o
Meu arquivo de interface SWIG é o seguinte:
/* foo.i */
%module foo
%{
#include "foo.hpp"
%}
%inclu,de "foo.hpp"
Eu gero foo_wrap.cxx digitando
swig -python -c++ foo.i
e depois compile.
g++ -c -fPIC -I/usr/include/python2.6 foo_wrap.cxx
g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so
A compilação foi bem-sucedida, mas quando executo Python eimport foo
, Recebo um erro de símbolo indefinido.
>>> import foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo.py", line 25, in <module>
_foo = swig_import_helper()
File "foo.py", line 21, in swig_import_helper
_mod = imp.load_module('_foo', fp, pathname, description)
ImportError: ./_foo.so: undefined symbol: _ZN2TCC1Ev
Oque esta acontecendo aqui? O problema parece ser que a etapa de vinculação não está localizando a definição do construtor TC :: TC.
Nota: Se eu alterar a etapa de vinculação para
g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so
então tudo funciona. Mas isso é uma opção para o meu problema real, onde não tenho o código-fonte bruto? Pode-se extrair um .o de um .a? Presumivelmente, é possível fazer isso manualmente, mas não deveria haver alguma maneira automatizada de fazer isso?