gpt4 book ai didi

python - 使用 cmake 构建 Python 共享对象绑定(bind),这取决于外部库

转载 作者:太空狗 更新时间:2023-10-30 00:08:41 25 4
gpt4 key购买 nike

我们有一个名为 dbookpy.c 的 c 文件,它将提供一个绑定(bind)一些 C 函数的 Python。

接下来我们决定使用 cmake 构建一个合适的 .so,但似乎我们在绑定(bind)中链接外部库“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

有没有人知道为什么这不起作用?

非常感谢。

添加

最佳答案

您需要将 dbookpy 链接到 dbook:

target_link_libraries(dbookpy dbook)

ADD_LIBRARY(dbookpy dbookpy) 行之后添加它应该就可以了。

我看到您正在使用 IMPORTED - 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 库似乎已安装或至少预计会安装。我认为您不需要在这里导入 - 这似乎是一个常规的链接问题。但这可能只是创建要在此处发布的最小示例的副作用。

听上去,为了整理出链接库和链接目录,我可能会使用 find_library(),它会在合理的默认位置查找,例如/usr/local/lib,然后将其附加到链接库。

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

无论如何,看起来你现在已经整理好了。

关于python - 使用 cmake 构建 Python 共享对象绑定(bind),这取决于外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/992068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com