将复杂的链接标志从Makefile传递到设置.py

2024-05-15 22:20:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写Python 2.7 C++扩展。Python扩展包了C++库(Kaldi)的一部分。 以前,我创建了共享库并用Python扩展分发它。(我需要设置LD_LIBRARY_PATH)。在

我想静态编译扩展。Kaldi库可以静态编译(使用-fPIC标志)。问题是编译依赖于其他库,而标志是由configure脚本生成的。在

我想使用setup.py编译扩展,并从Makefile中“窃取”编译设置。 你会怎么做?在

链接共享库的命令是:

$(CXX) -shared -DPIC -o $@ -Wl,-soname=$@,--whole-archive $^ -Wl,--no-whole-archive $(EXTRA_LDLIBS) $(LDFLAGS) $(LDLIBS)

setup.py中,我有:

^{pr2}$

$(EXTRA_LDLIBS)$(LDFLAGS)和{}由configure脚本生成。 $(LDLIBS)包含一些静态库,有些是共享的。在

现在我有了

if STATIC:
    # STATIC 
    # TODO extract linking parameters from Makefile
    library_dirs, libraries = [], []
    extra_objects = ['pykaldi.a', ]
else:
    # DYNAMIC
    library_dirs = ['.'],
    libraries = ['pykaldi']
    extra_objects = []
ext_modules.append(Extension('pykaldi.decoders',
                             language='c++',
                             include_dirs=['..', 'fst'],
                             library_dirs=library_dirs,
                             libraries=libraries,
                             extra_objects=extra_objects,
                             sources=['pykaldi/decoders.pyx'],
                             ))

注1:我使用的是Cython,但这不重要。在

注2:我知道我可以使用make编译扩展,我更喜欢使用setup.py来更好地部署。在


Tags: py脚本librariesobjectsconfigure标志setuplibrary
1条回答
网友
1楼 · 发布于 2024-05-15 22:20:47

在构建python可执行文件时,必须将静态扩展链接到python。在

这是因为扩展是使用dlopen(或Windows上的LoadLibrary)加载到解释器中的,而且这个功能不能支持静态的“库”,而静态“库”不过是一个目标文件的tarball。对象文件是一个原始表单,在经过链接阶段之前,系统运行时仍然无法使用它们。在

相关问题 更多 >