2009-06-14 2 views
5

우리는 dbookpy.c라는 c 파일을 가지고 있는데,이 파일은 파이썬 바인딩에 일부 C 함수를 제공합니다.외부 라이브러리에 의존하는 cmake와의 Python 공유 객체 바인딩 구현하기

다음은 우리가 cmake와 적절한 .so를 구축하기로 결정하지만, 우리는 바인딩의 외부 라이브러리 'libdbook를'연결에 관해서 뭔가 잘못하고있는 것 같다

다음과 같이 CMakeLists.txt은 다음과 같습니다

PROJECT(dbookpy) 

FIND_PACKAGE(PythonInterp) 
FIND_PACKAGE(PythonLibs) 

INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) 
INCLUDE_DIRECTORIES("/usr/local/include") 
LINK_DIRECTORIES(/usr/local/lib) 
OPTION(BUILD_SHARED_LIBS "turn OFF for .a libs" ON) 

ADD_LIBRARY(dbookpy dbookpy) 
SET_TARGET_PROPERTIES(dbookpy PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES dbook) 
SET_TARGET_PROPERTIES(dbookpy PROPERTIES LINKER_LANGUAGE C) 
#SET_TARGET_PROPERTIES(dbookpy PROPERTIES LINK_INTERFACE_LIBRARIES dbook) 
#SET_TARGET_PROPERTIES(dbookpy PROPERTIES ENABLE_EXPORTS ON) 
#TARGET_LINK_LIBRARIES(dbookpy LINK_INTERFACE_LIBRARIES dbook) 

SET_TARGET_PROPERTIES(dbookpy 
PROPERTIES 
    SOVERSION 0.1 
    VERSION 0.1 
) 

그런 다음 우리는 구축 :

x31% mkdir build 
x31% cd build 
x31% cmake .. 
-- Check for working C compiler: /usr/bin/gcc 
-- Check for working C compiler: /usr/bin/gcc -- works 
-- Check size of void* 
-- Check size of void* - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/edd/dbook2/dbookpy/build 
x31% make 
Scanning dependencies of target dbookpy 
[100%] Building C object CMakeFiles/dbookpy.dir/dbookpy.o 
Linking C shared library libdbookpy.so 
[100%] Built target dbookpy 

지금까지 너무 좋아. Python에서 테스트 :

x31% python 
Python 2.5.4 (r254:67916, Apr 24 2009, 15:28:40) 
[GCC 3.3.5 (propolice)] on openbsd4 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import libdbookpy 
python:./libdbookpy.so: undefined symbol 'dbook_isbn_13_to_10' 
python:./libdbookpy.so: undefined symbol 'dbook_isbn_10_to_13' 
python:./libdbookpy.so: undefined symbol 'dbook_sanitize' 
python:./libdbookpy.so: undefined symbol 'dbook_check_isbn' 
python:./libdbookpy.so: undefined symbol 'dbook_get_isbn_details' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: Cannot load specified object 

흠. 링커 오류입니다. libdbook과 연결되지 않은 것 같습니다 :

x31% ldd libdbookpy.so 
libdbookpy.so: 
     Start End  Type Open Ref GrpRef Name 
    05ae8000 25aec000 dlib 1 0 0  /home/edd/dbook2/dbookpy/build/libdbookpy.so.0.1 

아니요. libdbook에 대한 적절한 연결은 다음과 같습니다.

x31% ldd /usr/local/bin/dbook-test 
/usr/local/bin/dbook-test: 
    Start End  Type Open Ref GrpRef Name 
    1c000000 3c004000 exe 1 0 0  /usr/local/bin/dbook-test 
    08567000 28571000 rlib 0 2 0  /usr/lib/libm.so.5.0 
    09ef7000 29efb000 rlib 0 1 0  /usr/local/lib/libdbook.so.0.1 
    053a0000 253d8000 rlib 0 1 0  /usr/lib/libc.so.50.1 
    0c2bc000 0c2bc000 rtld 0 1 0  /usr/libexec/ld.so 

아무 이유없이 작동하지 않는 사람이 있습니까?

감사합니다.

EDD

답변

3

당신은 dbook에 대해 dbookpy 연결해야합니다

target_link_libraries(dbookpy dbook) 

그냥 라인 ADD_LIBRARY(dbookpy dbookpy) 후를해야한다고 추가.

내가 가져온 사용하는 볼 - IMPORTED_LINK_INTERFACE_LIBRARIES에 대한 도움말을 읽

:

Lists libraries whose interface is included when an IMPORTED library target is 
linked to another target. The libraries will be included on the link line for 
the target. Unlike the LINK_INTERFACE_LIBRARIES property, this property 
applies to all imported target types, including STATIC libraries. This 
property is ignored for non-imported targets. 

가 그래서/usr/local/lib에있다 "dbook가", 가져온 라이브러리해야한다는 것을 의미

add_library(dbook SHARED IMPORTED) 

정말 원하는 것입니까? 내 말은, 임포트 된 라이브러리는 CMake 외부에 빌드되지만 소스 트리의 일부로 포함되는 라이브러리입니다. dbook 라이브러리가 설치되어 있거나 적어도 설치 될 것으로 예상됩니다. 나는 여기에 수입이 필요하다고 생각하지 않는다. 그것은 정기적 인 연계 문제로 보인다. 그러나 이것은 여기에 게시 할 최소한의 예를 만드는 부작용 일 수 있습니다.

링크 된 라이브러리 및 링크 디렉토리를 정렬하기 위해 나는/usr/local/lib와 같은 현명한 기본 위치를보고 find_library()을 사용하고 링크 라이브러리.

find_library(DBOOK_LIBRARY dbook REQUIRED) 
target_link_libraries(dbookpy ${DBOOK_LIBRARY})  

어쨌든 지금 정렬 한 것처럼 보입니다.

+0

안녕하세요, 아래 답변을 참조하십시오. –

1

도움 주셔서 감사합니다.

아마도 IMPORTED는 필요하지 않을 수도 있습니다. LINK_LIBRARIES (dbookpy dbook)을 추가하면 실제로 gcc 실행에 -ldbook이 추가되므로 위대합니다.

그러나 cmake는 LINK_DIRECTORIES을 무시 나타납니다, 그래서 결코 -ldbook 찾습니다

/usr/bin/gcc -fPIC -shared -o libdbookpy.so.0.1 "CMakeFiles/dbookpy.dir/dbookpy.o" -ldbook 
/usr/bin/ld: cannot find -ldbook 

을 여기 스탠드로 CMakeList은 다음과 같습니다

PROJECT(dbookpy) 
SET(CMAKE_VERBOSE_MAKEFILE ON) 

OPTION(BUILD_SHARED_LIBS "turn OFF for .a libs" ON) 
ADD_LIBRARY(dbookpy dbookpy) 
SET_TARGET_PROPERTIES(dbookpy PROPERTIES LINKER_LANGUAGE C) 


FIND_PACKAGE(PythonInterp) 
FIND_PACKAGE(PythonLibs) 

INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) 
INCLUDE_DIRECTORIES(/usr/local/include) 
target_link_libraries(dbookpy dbook) 
LINK_DIRECTORIES("/usr/local/lib") 

SET_TARGET_PROPERTIES(dbookpy 
PROPERTIES 
     SOVERSION 0.1 
     VERSION 0.1 
) 

INSTALL(TARGETS dbookpy 
     LIBRARY DESTINATION lib 
) 

어떤 아이디어?

+1

감사합니다. 대답은 ADD_LIBRARY 전에 LINK_DIRECTORIES를 추가하는 것입니다. –

+0

target_link_libraries는 lib의 경로가 아니라 프로젝트 이름과 lib 이름을 필요로한다는 점에 유의할 필요가 없습니다. 즉, -l 옆에 나타날 부분, 즉. db (Berkeley DB의 경우)는 libdb이고 -ldb로 표시됩니다. – Asher

관련 문제