2011-04-22 134 views
4

我使用distutils構建用C++編寫的Python擴展模塊。我遇到的問題是,爲了編譯擴展模塊,我需要鏈接一個特定的共享庫。這需要設置一個額外的編譯器標誌。因此,我通過Python文檔搜索並找出Extension對象的extra_compile_args屬性。所以,我試過如下:使用distutils構建Python擴展模塊

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,構建運行沒有錯誤!

那麼,這是怎麼回事?我如何編譯需要鏈接到共享庫的擴展模塊?

回答

5

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

例如:

libraries=["rt"] 

你離開關閉該選項和lib部分。

3

distutils的目的之一是使您的代碼不依賴於單個編譯器。你的「-l somelib」看起來像是用於GCC(儘管它應該是「-lsomelib」,沒有空格)。這就是爲什麼您使用Extension類的libraries選項。然後Distutils將相應的鏈接命令傳遞給它正在使用的任何編譯器。

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