gpt4 book ai didi

python - 编译python模块扩展时如何静态链接库

转载 作者:IT老高 更新时间:2023-10-28 22:22:41 27 4
gpt4 key购买 nike

我想修改 setup.py 文件,以便命令“python setup.py build”编译基于 C 的扩展模块,该模块静态(而不是动态)链接到库。

该扩展目前动态链接到许多库。除了静态链接到一个库之外,我想保持一切不变。我已经通过手动修改对 distutils 运行的 gcc 的调用成功地做到了这一点,尽管它要求我明确列出依赖库。

也许这是太多信息,但为了清楚起见,这是在“python setup.py build”脚本期间执行的最终链接命令:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib -ligraph -o build/lib.linux-x86_64-2.7/igraph/core.so

这是我的手动修改:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib /system/lib/libigraph.a -lxml2 -lz -lgmp -lstdc++ -lm -ldl -o build/lib.linux-x86_64-2.7/igraph/core.so

Distributing Python Modules 的第 2.3.4 节讨论了库的规范,但只有“library_dirs”是合适的,并且这些库是动态链接的。

我使用 Linux 环境进行开发,但该软件包也将在 Windows 上编译和安装,所以我想要一个可移植的解决方案。

谁能告诉我在哪里寻找说明,或者如何修改 setup.py 脚本? (提前致谢!)

我是 StackOverflow 的新手,如果我没有正确标记这个问题,或者我在这篇帖子中犯了其他错误,我深表歉意。

最佳答案

6 - 7 年后,使用 Python 扩展的静态链接仍然没有得到很好的记录。正如 OP 在评论中指出的那样,用法取决于操作系统。

在 Linux/Unix 上

静态库与目标文件一样被链接,并且应该与路径及其扩展名一起进入 extra_objects

在 Windows 上

编译器查看链接库是静态的还是动态的,静态库名进入库列表,目录进入library_dir

两个平台的解决方案

对于下面的例子,我将使用与OP相同的库场景,链接igraph static和zxml2 gmp 动态的。这个解决方案有点老套,但至少对每个平台都做了正确的事情。

static_libraries = ['igraph']
static_lib_dir = '/system/lib'
libraries = ['z', 'xml2', 'gmp']
library_dirs = ['/system/lib', '/system/lib64']

if sys.platform == 'win32':
libraries.extend(static_libraries)
library_dirs.append(static_lib_dir)
extra_objects = []
else: # POSIX
extra_objects = ['{}/lib{}.a'.format(static_lib_dir, l) for l in static_libraries]

ext = Extension('igraph.core',
sources=source_file_list,
libraries=libraries,
library_dirs=library_dirs,
include_dirs=include_dirs,
extra_objects=extra_objects)

在 MacOS 上

我猜这也适用于 MacOS(使用 else 路径),但我还没有测试过。

关于python - 编译python模块扩展时如何静态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4597228/

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