我想修改 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 的新手,所以如果我没有正确标记这个问题,或者我在这篇文章中犯了一些其他错误,我深表歉意。
在 Linux / Unix 上
extra_objects
。在 Windows 上
适用于两个平台的解决方案
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 上else
路径),但我还没有测试过。
extra_link_args
和 Extension
选项。 (另见此处。)
您可能需要修改一些依赖于操作系统的代码才能获得特定平台的正确参数格式。
g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed