18

build_clibsetup.py から外部 (Python 以外の) C ライブラリを構築するために distutils でコマンドを使用する良い例はありますか? この件に関するドキュメントはまばらであるか、存在しないようです。

私の目的は、非常に単純な外部ライブラリを構築し、それにリンクする cython ラッパーを構築することです。私が見つけた最も単純な例はhere ですが、これはsystem()gcc への呼び出しを使用しており、これはベストプラクティスではありません。

4

1 に答える 1

17

ライブラリ名を文字列として渡す代わりに、コンパイルするソースを含むタプルを渡します。

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()

こんにちはC

int hello(void) { return 42; }

こんにちは。

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 に答える