2009-06-14 4 views
5

dbookpy.cと呼ばれるcファイルがあります。これはPythonバインディングにいくつかの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 

Hmmm。リンカーエラー。 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 

これはなぜ機能しないのですか?

多くのありがとうございます。

エド

答えて

3

あなたがdbookに対してdbookpyリンクする必要があります。

target_link_libraries(dbookpy dbook) 

はちょうどラインADD_LIBRARY(dbookpy dbookpy)後にそれを行う必要があることを追加します。

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" は、インポートされたライブラリーでなければならないことを意味します:

IMPORTED_LINK_INTERFACE_LIBRARIESのヘルプを読み込む - 私はあなたがインポート使用している参照

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)を追加すると、実際にgldの実行に-ldbookが追加されます。

しかしcmakeのはLINK_DIRECTORIESを無視するように見える、と-ldbookが見つからないので、決して:

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 
) 

任意のアイデアを:それはスタンドとしてここ

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

はCMakeListありますか?

+1

答えはADD_LIBRARYの前にLINK_DIRECTORIESを追加することです。 –

+0

target_link_librariesはlibのパスではなく、プロジェクトの名前とlibの名前を期待しています。言い換えれば、-lの隣に表示される部分、つまり、 db(Berkeley DB用)はlibdbで、-ldbとして表示されます。 – Asher

関連する問題