Принимая ваш ответ, я получил достаточно репутации, чтобы дать вам голос!

убский вопрос. Я пытаюсь узнать, как использовать 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"
%}
%inclu,de "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? Предположительно можно сделать это вручную, но разве не должен быть какой-то автоматизированный способ сделать это?

Ответы на вопрос(1)

Ваш ответ на вопрос