[英]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.