我正在编写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
中,我有:
$(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
来更好地部署。在
在构建python可执行文件时,必须将静态扩展链接到python。在
这是因为扩展是使用dlopen(或Windows上的LoadLibrary)加载到解释器中的,而且这个功能不能支持静态的“库”,而静态“库”不过是一个目标文件的tarball。对象文件是一个原始表单,在经过链接阶段之前,系统运行时仍然无法使用它们。在
相关问题 更多 >
编程相关推荐