我们有一个名为 dbookpy.c 的 ac 文件,它将提供一个 Python 绑定一些 C 函数。
接下来我们决定用 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
有谁知道为什么这不起作用?
非常感谢。
埃德