이것은 멍청한 질문입니다. SWIG를 사용하여 C++ 라이브러리 용 파이썬 인터페이스를 만드는 방법을 배우려고합니다. 라이브러리는 독점적 인 타사 라이브러리입니다. 그것은 헤더 파일 (foo.h)과 정적 아카이브 (libfoo.a)의 형태로 나에게 온다.정적 라이브러리 용 SWIG Python 래퍼 컴파일?
문제를 단순화하기 위해 동일한 병리 현상이 있다고 생각되는 사례를 정리했습니다. 동일한 오류 메시지가 표시됩니다.
/* 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
다음과 같이 내 꿀꺽 꿀꺽 인터페이스 파일은 다음과 같습니다
/* foo.i */
%module foo
%{
#include "foo.hpp"
%}
%include "foo.hpp"
나는 컴파일 후
swig -python -c++ foo.i
등을 입력하여 foo_wrap.cxx을 생성 .
는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
컴파일은 성공,하지만 난 파이썬과 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
다음 모든 작품에 대한 연결 단계를 변경하는 경우. 그러나 원시 코드가없는 실제 문제에 대한 옵션입니까? .a 파일에서 .o 파일을 추출 할 수 있습니까? 아마도 손으로이 작업을 수행 할 수는 있지만 자동화 된 방법으로 작업을 수행하면 안됩니까?
이 댓글은 교육적이었고 내 문제를 해결 한 것 같습니다. 고맙습니다! 불행히도, 나는 upvote에 충분한 명성이 없습니다. – user1504
귀하의 답변을 수락함으로써 투표를하기에 충분한 담당자를 얻었습니다! – user1504