【问题标题】:Using distutils and build_clib to build C library使用 distutils 和 build_clib 构建 C 库
【发布时间】:2013-05-31 09:27:28
【问题描述】:

有没有人有一个在 distutils 中使用build_clib 命令从 setup.py 构建外部(非 python)C 库的好例子?有关该主题的文档似乎很少或根本不存在。

我的目标是构建一个非常简单的外部库,然后构建一个链接到它的 cython 包装器。我发现的最简单的例子是here,但这使用了system() 对gcc 的调用,我无法想象这是最佳实践。

【问题讨论】:

  • "如何从 setup.py 构建第三方 C/C++ 库?"这是一个重要的问题和常见用例(如果您正在为 C 库编写 Python 绑定,则 setup.py 需要先从源代码构建库,然后才能构建 Python 扩展)。我希望文档能更好地涵盖这一点(完全!)
  • 感谢分享,否则我永远不会想到这一点。让我的工作在github.com/hickford/primesieve-python/blob/master/setup.py
  • 检查stackoverflow.com/questions/50938128/…,了解如何调整它以生成动态库(共享对象)。

标签: python cython


【解决方案1】:

不要将库名称作为字符串传递,而是传递一个包含要编译的源的元组:

setup.py

import sys
from distutils.core import setup
from distutils.command.build_clib import build_clib
from distutils.extension import Extension
from Cython.Distutils import build_ext

libhello = ('hello', {'sources': ['hello.c']})

ext_modules=[
    Extension("demo", ["demo.pyx"])
]

def main():
    setup(
        name = 'demo',
        libraries = [libhello],
        cmdclass = {'build_clib': build_clib, 'build_ext': build_ext},
        ext_modules = ext_modules
    )

if __name__ == '__main__':
    main()

hello.c

int hello(void) { return 42; }

hello.h

int hello(void);

demo.pyx

cimport demo
cpdef test():
    return hello()

demo.pxd

cdef extern from "hello.h":
    int hello()

代码可用作要点:https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

【讨论】:

  • 嗨。我试图这样做,但显然“库”参数只需要一个带有库名称的字符串列表。对吗?...
  • 库参数应该是一个二元组列表,其中第一个元素是库的名称字符串,第二个元素是参数字典。请参阅 build_libraries() 函数的来源:svn.python.org/projects/python/branches/pep-0384/Lib/distutils/…
  • 如何将自定义参数(如-O2)传递给编译器?
  • 对于其他对此感到困惑的人:python setup.py develop 不会自动调用 build_clib。你必须手工完成。 python setup.py build_clib
猜你喜欢
  • 2011-05-30
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
相关资源
最近更新 更多