【问题标题】:Passing complex linking flags from Makefile to setup.py将复杂的链接标志从 Makefile 传递到 setup.py
【发布时间】: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


    【解决方案1】:

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

    这是因为使用 dlopen(或 Windows 上的 LoadLibrary)将扩展加载到解释器中,并且此功能不支持静态“库”,它们只不过是目标文件的 tarball。目标文件是一种原始形式,系统运行时仍然无法使用它们,直到它们经过链接阶段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 2021-04-01
      相关资源
      最近更新 更多