【发布时间】:2014-01-09 10:47:32
【问题描述】:
我正在编写 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我有:
ext_modules.append(Extension('pykaldi.decoders',
language='c++',
include_dirs=['..', 'fst'],
library_dirs=['.'],
libraries=['pykaldi'],
sources=['pykaldi/decoders.pyx'],
))
$(EXTRA_LDLIBS)、$(LDFLAGS) 和 $(LDLIBS) 由 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 以便更好地部署。
【问题讨论】:
标签: c++ python makefile setuptools setup.py