簡體   English   中英

使用distutils構建Python擴展模塊

[英]Building Python extension module with distutils

我正在使用distutils來構建一個用C ++編寫的Python擴展模塊。 我遇到的問題是,為了編譯擴展模塊,我需要鏈接某個共享庫。 這需要設置額外的編譯器標志。 因此,我搜索了Python文檔,並了解了Extension對象的extra_compile_args屬性。 所以我嘗試了以下方法:

from distutils.core import setup, Extension

module = Extension('test', sources = ['test.cpp'])
module.extra_compile_args = ['--std=c++0x', '-l mylib'];
setup(name = 'test', version = '1.0', ext_modules = [module])

這似乎是編譯的,除非我在Python中導入我的模塊時由於未定義的符號而引發ImportError異常。 所以,顯然圖書館沒有正確鏈接。 所以我嘗試編寫一個與共享庫鏈接的丟棄C ++程序,它運行正常。 然后我意識到distutils正在發生一些奇怪的事情,因為如果我添加一個鏈接到偽造庫名稱的編譯參數,distutils只會編譯所有內容而沒有問題:

module.extra_compile_args = ['--std=c++0x', '-l some_fake_library'];

當我運行setup.py build ,構建運行沒有錯誤!

那么,這里發生了什么? 如何編譯需要鏈接到共享庫的擴展模塊?

實際上有一個特殊的選擇。

例如:

libraries=["rt"]

你不用選項和lib部分。

distutils的目的之一是使您的代碼不依賴於單個編譯器。 你的“-l somelib”看起來似乎與GCC一起工作(即使它應該是“-lsomelib”,沒有空間)。 這就是您使用Extension類的libraries選項的原因。 然后,Distutils會將相應的鏈接命令傳遞給它正在使用的任何編譯器。

您還可以查看distutils正在使用的實際構建命令,並自己執行它們以查看出現了什么問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM