18

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

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

4

1 回答 1

17

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

安装程序.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()

你好ç

int hello(void) { return 42; }

你好.h

int hello(void);

演示.pyx

cimport demo
cpdef test():
    return hello()

演示.pxd

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

代码作为要点提供:https ://gist.github.com/snorfalorpagus/2346f9a7074b432df959

于 2013-06-01T09:11:59.967 回答