2011-01-05 3 views
1

이것은 멍청한 질문입니다. 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 파일을 추출 할 수 있습니까? 아마도 손으로이 작업을 수행 할 수는 있지만 자동화 된 방법으로 작업을 수행하면 안됩니까?

답변

6

나는 당신에게 맞는 케이스인지는 모르지만 일반적으로 오브젝트 파일과 정적 라이브러리의 순서가 중요합니다. 순서는 초기화 순서를 정의합니다.

가장 일반적인 개체 및/또는 정적 아카이브를 마지막 매개 변수로 넣어야합니다. 가장 의존성이 많은 객체/아카이브는 처음에 위치해야합니다.

예. 오브젝트 파일 A.o는 fucntion A()를 제공합니다. 객체 B.o는 함수 A()를 사용합니다. ld -o libmy.so B.o A.o (마지막 매개 변수로 가장 일반적인 파일 A.o)을 써야합니다.

기호가 파일에있는 경우 objdump -x _foo.so으로 확인할 수도 있습니다.

오른쪽 호출은 다음과 같습니다

g++ -shared -L. -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -lfoo -o _foo.so이 -lpython2.6와 혼동하지 마십시오, 그것은 런타임에 연결된 동적 라이브러리 입니다.

+0

이 댓글은 교육적이었고 내 문제를 해결 한 것 같습니다. 고맙습니다! 불행히도, 나는 upvote에 충분한 명성이 없습니다. – user1504

+0

귀하의 답변을 수락함으로써 투표를하기에 충분한 담당자를 얻었습니다! – user1504

관련 문제