gpt4 book ai didi

python - 使用 distutils 的 setup.py 编译 C 共享库,当库依赖于第二个共享库时

转载 作者:太空狗 更新时间:2023-10-29 21:56:44 25 4
gpt4 key购买 nike

我在 OSX 上,试图用 distutils 的 setup.py 在 C 中编译一个共享库(使用 ctypes 在 python 中使用)。我是 distutils 的新手,但是当我要编译的共享库 (libreboundx.so) 依赖于另一个共享库 (librebound.so) 时,我遇到了问题。明确地,在 modify_orbits_direct.c 中我有

#include "rebound.h"

rebound.h在目录/Users/dt/rebound/src/下,rebound.h中的所有函数都在/Users/dt/rebound/下的共享库librebound.so中。

与 cc 的链接看起来像。

cc -fPIC -shared reboundx.o -L/Users/dt/rebound -lrebound -o libreboundx.so

更新:这种情况看起来与第 2 节末尾的示例完全一样。 3 在 https://docs.python.org/2/extending/building.html .我已经更新了我的 setup.py 以模仿那个:

libreboundxmodule = Extension('libreboundx',
sources = [ 'src/reboundx.c',
'src/modify_orbits_direct.c'],
include_dirs = ['src', '/Users/dt/rebound/src'],
extra_compile_args=['-fstrict-aliasing', '-O3','-std=c99','-march=native', '-D_GNU_SOURCE', '-fPIC'],
library_dirs=['/Users/dt/rebound'],
libraries=['rebound'],
)

这在我运行时安装正常

pip install -e ./

构建输出:

You are using pip version 7.0.3, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Obtaining file:///Users/dtamayo/Documents/workspace/reboundx
Installing collected packages: reboundx
Running setup.py develop for reboundx
Successfully installed reboundx-1.0

但是当我尝试

import reboundx

在 Python 中,我得到一个 OSError: dlopen(libreboundx.so, 10): Symbol not found: _reb_boundary_particle_is_in_box,这是另一个库 (librebound.so) 中的一个函数,它甚至没有在代码中被调用对于 libreboundx.so。

如果我将共享库与上面的 cc 命令链接,一切正常,并且我可以在 C 中使用共享库 libreboundx.so 非常好。如果我尝试使用相同的 libreboundx.so,我将使用 cc 命令进行编译,并且把它贴在 setup.py 会放的地方,然后尝试在 python 中导入 reboundx,我反而得到了

OSError: dlopen(/Users/dtamayo/Documents/workspace/reboundx/reboundx/../libreboundx.so, 10): Library not loaded: librebound.so

引用自:/Users/dtamayo/Documents/workspace/reboundx/libreboundx.so 原因:找不到图片

这会不会像 rpath 问题,在运行时 libreboundx.so 不知道在哪里寻找 librebound.so?

最佳答案

感谢所有建议。我应该在问题中指定,最后我想要一个可以打包以上传到 PyPy 的解决方案,以便用户可以使用单个命令进行安装。它还应该在 OSX 和 Linux 上运行,所以我更喜欢不涉及 install_name_tool 的解决方案。

我还没有能够测试它,但我想添加

 runtime_library_dirs=['/Users/dt/rebound'],

library_dirs 旁边应该可以解决 Linux 上的问题。显然这在 Mac 上不起作用,但您可以使用 extra_link_args。在上面发布的 libreboundxmodule 定义下面添加它,

if platform.system() == 'Darwin':
extra_link_args.append('-Wl,-rpath,'+'/Users/dtamayo/Documents/workspace/rebound')

解决了我的问题。我在这里找到了答案:Python runtime_library_dirs doesn't work on Mac

关于python - 使用 distutils 的 setup.py 编译 C 共享库,当库依赖于第二个共享库时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32283062/

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