使用distutils和build_clib来构建C库

Sno*_*gus 16 python cython

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

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

Sno*_*gus 15

不是将库名称作为字符串传递,而是传递带有源代码的元组以进行编译:

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()
Run Code Online (Sandbox Code Playgroud)

你好ç

int hello(void) { return 42; }
Run Code Online (Sandbox Code Playgroud)

hello.h

int hello(void);
Run Code Online (Sandbox Code Playgroud)

demo.pyx

cimport demo
cpdef test():
    return hello()
Run Code Online (Sandbox Code Playgroud)

demo.pxd

cdef extern from "hello.h":
    int hello()
Run Code Online (Sandbox Code Playgroud)

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

  • 对于对此感到困惑的其他人:“python setup.pydevelop”不会自动调用build_clib。你必须手工完成。`python setup.py build_clib` (2认同)