2013-08-20 3 views
0

파이썬에서 호출하기를 원하는 C++ 함수가 있습니다. 함수 자체는 매우 단순하지만 C++에서만 수행 할 수있는 IPC 호출을 포함합니다. 컴파일하려면 C++ 코드가 다른 라이브러리를 연결해야합니다. SWIG를 사용하려고합니다. 모든 것이 잘 컴파일이와SWIG 래퍼를 다른 라이브러리와 연결하기

all: swig object shared 

object: swig 
    ${CC} -c ${MODULE}_wrap.cxx ${INCLUDES} 

shared: 
    ${CC} -Wl,--verbose -shared ${MODULE}_wrap.o -o _${MODULE}.so 

swig: 
    ${SWIG} -c++ -python ${MODULE}.i 

,하지만 파이썬에서 내 모듈을 가져 오는 것은 나 "정의되지 않은 기호"오류를 제공합니다 : I는 다음과 같습니다 Makefile을 가지고있다. 나는 shared 라인을 변경하는 경우 :

shared: 
    ${CC} -Wl,--verbose -shared ${MODULE}_wrap.o -o _${MODULE}.so ${LIBS} 

collect2: ld returned 1 exit status와 함께 컴파일에 실패했지만 오류가 정확히 말해주지 않습니다. 장황한 링커 출력에는 "일부 lib를 열려고 시도하지 못했습니다"라는 줄이 있지만 그 중 소수는 "성공"이라고 말합니다. 실패했다고 말하는 사람들이 링크가 일어나는 것을 막을 수 있습니까? SWIG 모듈을 사용해도 가능한 일을하려고합니까?

답변

1

예, 가능합니다. 파이썬이 모듈을로드 할 때 래핑 된 C/C++ 모듈이 의존하는 공유 라이브러리가 확인되어야한다. ldd으로 라이브러리 (생성 된 Swig)를 검사하여 라이브러리가 종속 된 라이브러리를 확인합니다. 모듈을 링크 할 때 rpath (런타임 경로, 예 : -rpath=/path/to/your/libs for gcc)가 libs의 위치를 ​​가리 키도록 설정하는 것이 가장 좋습니다. 또는 파이썬을 실행하기 전에 LD_LIBRARY_PATH을 적절하게 설정할 수 있습니다.

+0

단지 객체 파일이기 때문에 SWIG 생성 라이브러리에서'ldd'를 수행 할 수 없습니다. 그러나 나는 이것을 어떻게해서든지 시도했다. '-rpath ='는 작동하지 않지만'-Xlinker -rpath -Xlinker [path]'를 시도했습니다. 나는 또한 LD_LIBRARY_PATH를 시도했다. 아직 정의되지 않은 기호 오류가 발생합니다. 나는 명백한 무엇인가 놓치고있는 것처럼 느낀다. – sagargp

관련 문제