¿Compilar un contenedor SWIG Python para una biblioteca estática?

Esta es una pregunta novata. Estoy tratando de aprender cómo usar SWIG para hacer una interfaz de Python para una biblioteca C ++. La biblioteca es una biblioteca patentada de terceros; viene a mí en forma de un archivo de encabezado (foo.h) y un archivo estático (libfoo.a).

Para simplificar las cosas, he preparado un ejemplo que creo que tiene la misma patología. Los mismos mensajes de error de todos modos.

/* foo.hpp */
class TC {
    public:
       TC();
       int i;
    private:
};

Como referencia, aquí está foo.c. Solo tengo el encabezado y los archivos de la biblioteca real de terceros.

/*foo.cxx */
#include "foo.hpp"
TC::TC() {
    i = 0;
}

Hice esta biblioteca escribiendog++ -c foo.cxx && ar rcs libfoo.a foo.o

Mi archivo de interfaz SWIG es el siguiente:

/* foo.i */ 
%module foo
%{
#include "foo.hpp"
%}
%inclu,de "foo.hpp"

Genero foo_wrap.cxx escribiendo

swig -python -c++ foo.i

y luego compilar.

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

La compilación tiene éxito, pero cuando ejecuto Python yimport foo, Obtengo un error 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

¿Que está pasando aqui? El problema parece ser que el paso de vinculación no es encontrar la definición del constructor TC :: TC.

Nota: si modifico el paso de vinculación a

g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so

entonces todo funciona. ¿Pero es esta una opción para mi problema real, donde no tengo el código fuente en bruto? ¿Se puede extraer un .o de un .a? Presumiblemente uno puede hacer esto a mano, pero ¿no debería haber alguna forma automatizada de hacerlo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta