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

问题描述 投票:0回答:3

我想修改 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

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

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

有人可以告诉我在哪里寻找说明,或者如何修改 setup.py 脚本吗? (预先感谢!)

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

python static compilation
3个回答
38
投票
6 - 7 年过去了,与 Python 扩展的静态链接的记录仍然很少。正如OP在评论中指出的那样,其用法取决于操作系统。

在 Linux / Unix 上

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

extra_objects

在 Windows 上

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

适用于两个平台的解决方案

对于下面的示例,我将使用与 OP 相同的库场景,链接

igraph

 静态和 
z
xml2
gmp
 动态。这个解决方案有点hackish,但至少对每个平台都做了正确的事情。

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

 路径),但我还没有测试过。


14
投票
如果所有其他方法都失败了,那么

extra_compile_args

 构建器总是有很少记录的 
extra_link_args
Extension
选项。 (另见
此处。)

您可能需要修改一些依赖于操作系统的代码才能获得特定平台的正确参数格式。


0
投票
这有可能有效吗?

g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
    
© www.soinside.com 2019 - 2024. All rights reserved.