Это нубский вопрос. Я пытаюсь узнать, как использовать SWIG для создания интерфейса Python для библиотеки C ++. Библиотека является проприетарной сторонней библиотекой; он приходит ко мне в виде заголовочного файла (foo.h) и статического архива (libfoo.a).
Чтобы упростить дело, я подготовил пример, который, я думаю, имеет ту же патологию. В любом случае, одни и те же сообщения об ошибках.
/* foo.hpp */
class TC {
public:
TC();
int i;
private:
};
Для справки, вот foo.c. У меня есть только файлы заголовков и архивов для настоящей сторонней библиотеки.
/*foo.cxx */
#include "foo.hpp"
TC::TC() {
i = 0;
}
Я сделал эту библиотеку, набрав g++ -c foo.cxx && ar rcs libfoo.a foo.o
Мой файл интерфейса SWIG выглядит следующим образом:
/* foo.i */
%module foo
%{
#include "foo.hpp"
%}
%include "foo.hpp"
Я генерирую foo_wrap.cxx, набрав
swig -python -c++ foo.i
, а затем скомпилировать.
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
Компиляция завершается успешно, но когда я запускаю Python и import foo
, я получаю неопределенную ошибку символа.
>>> 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
Что здесь происходит? Кажется, проблема в том, что шаг связывания не находит определение конструктора TC :: TC.
Примечание: если я изменю шаг связывания на
g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so
тогда все работает. Но это вариант для моей реальной проблемы, где у меня нет исходного кода? Можно ли извлечь .o из .a? Предположительно можно сделать это вручную, но разве не должен быть какой-то автоматизированный способ сделать это?