2013-05-31 26 views
11

Có ai có ví dụ hay về việc sử dụng lệnh build_clib trong các biên dịch để xây dựng một thư viện C bên ngoài (không phải python) từ setup.py? Tài liệu về chủ đề dường như thưa thớt hoặc không tồn tại.Sử dụng các mấu và build_clib để xây dựng thư viện C

Mục tiêu của tôi là xây dựng một thư viện bên ngoài rất đơn giản, sau đó xây dựng một trình bao bọc cython liên kết với nó. Ví dụ đơn giản nhất tôi đã tìm thấy là here, nhưng điều này sử dụng cuộc gọi system() đến gcc mà tôi không thể tưởng tượng là thực tiễn tốt nhất.

+1

"Làm thế nào để xây dựng của bên thứ ba C/Thư viện C++ từ setup.py? " Đây là một câu hỏi quan trọng và trường hợp sử dụng phổ biến (nếu bạn đang viết các ràng buộc Python cho một thư viện C, thì setup.py cần xây dựng thư viện từ nguồn trước khi nó có thể xây dựng phần mở rộng Python của bạn). Tôi muốn các tài liệu được bảo hiểm này tốt hơn (ở tất cả!) –

+2

Cảm ơn bạn đã chia sẻ, tôi chưa bao giờ tìm ra điều này. Được tôi làm việc tại https://github.com/hickford/primesieve-python/blob/master/setup.py –

Trả lời

10

Thay vì đi qua một tên thư viện như là một chuỗi, vượt qua một tuple với các nguồn để biên dịch:

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

Mã có sẵn như là một ý chính: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

Xin chào. Tôi đã cố gắng để làm điều đó, nhưng rõ ràng là "thư viện" đối số chỉ mong đợi một danh sách các chuỗi với tên thư viện. Điều đó có đúng không? ... – dividebyzero

+0

Đối số thư viện phải là danh sách 2 bộ, phần tử đầu tiên trong số đó là chuỗi tên cho thư viện và thứ hai là từ điển của các tham số. Xem hàm build_libraries() nguồn: http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py – Snorfalorpagus

Các vấn đề liên quan