2011-05-11 23 views
6

我想在Mac OSX 10.6.5上編譯一個包。該包的安裝腳本依賴於distutils。問題是計算機的默認gcc是4.2版本(我通過在終端窗口中運行gcc --version來確定),但是當我運行'python setup.py build'時,我從輸出中看到distutils選擇gcc -4.0而不是4.2這是一個很大的問題,因爲我使用的代碼需要gcc> = 4.2。我沒有這臺機器的管理員權限,所以作爲一個工作區,我創建了一些將gcc-4.0發送到gcc-4.2的符號鏈接。結果是代碼編譯,但生成的.so文件不起作用(當我嘗試在python中導入它們時,出現抱怨共享對象中缺少初始化函數的錯誤)。Python distutils不使用正確版本的gcc

我試過在不同的mac上編譯這段代碼(10.6.6),它的工作方式就像一個魅力:distutils選擇4.2而不必強迫這樣做,我可以導入生成的共享對象,而不會出現問題。所以,我想要做的是在我的電腦上編譯代碼,而不必執行這種符號鏈接技巧......我只想讓distutils自動選擇4.2。我已經嘗試過將.so文件正確編譯並將它們傳輸到我的計算機,但由於許多原因(它們與我的計算機上不存在的庫鏈接,是與安裝的版本不同的版本)失敗。

有沒有人有任何建議嗎?

感謝, 喬希

回答

1

你可以調整你的distutils.cfg(見here),也可以通過命令行參數--compiler = gcc42(不知道最後一個)。

+0

這似乎並不奏效。有效的編譯器只是'gcc'。在版本中投擲不起作用 - 它會拋出一個錯誤,說它不知道如何使用gcc42進行構建。 – 2011-05-11 16:10:01

+0

應該可能是'--compiler = gcc-4.2' – cdarke 2011-05-11 16:11:44

+0

不幸的是,這仍然沒有幫助。如果您檢查distutils.ccompiler,可用的選項是「unix」或「minwg」。它似乎沒有注意到版本的東西。 – 2011-05-11 16:25:13

16

要強制distutils使用單獨的編譯器,可以通過環境重新定義一些變量。首先,找出使用的默認值是什麼的distutils:

>>> from distutils import sysconfig 
>>> sysconfig.get_config_var('LDSHARED') 
'gcc-4.0 -Wl,-F. -bundle -undefined dynamic_lookup' 
>>> sysconfig.get_config_var('CC') 
'gcc-4.0' 

接下來,你需要重新定義的,在海灣合作委員會的版本替換你想使用:

% LDSHARED="gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup" CC=gcc-4.2 \ 
    /usr/bin/python setup.py build_ext 

記住的是, SYSCONFIG默認值從最初被用來編譯蟒蛇Makefile中拉出,與他們捏造這樣可能會產生意想不到的結果:

>>> path = sysconfig.get_python_lib(plat_specific=1, standard_lib=1) 
>>> os.path.join(path, 'config', 'Makefile') 
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config/Makefile' 
3

你不說,它是由Python你的版本重新使用,但有可能您正在使用的機器上的默認Python不是Apple提供的Python 2.6.1,更有可能是從python.org安裝的。嘗試使用/usr/bin/python2.6運行構建腳本,該腳本應該是Apple提供的Python 2.6;那確實使用gcc-4.2

當您使用Python的Distutils的(通常是通過運行setup.py腳本或使用easy_install),Distutils的努力,以確保在您正在安裝的軟件包的任何C擴展模塊將使用相同的編譯器版本,併兼容編譯選項編譯(CPU archs,ABI等),就像用來構建Python本身一樣。傳統上,OS X的大多數python.org安裝程序提供了一個通用Python,可用於多個版本的OS X和多個CPU archs。這就是爲什麼他們用gcc-4.0構建的原因。如果您需要將gcc-4.2用於其他庫,那麼最安全的是使用由gcc-4.2構建的Python。蘋果提供的OS X 10.6系統Pythons是如此構建的。另外,對於最新版本的Python(2.7.1和3.2),python.org爲OS X 10.6提供了第二個OS X安裝程序變體,該變體也由gcc-4.2構建。但是,如果您沒有管理員訪問您的計算機,那不是一個選項。

你可以看到正在使用的Python默認方式:

which python 
4

您是否嘗試設置自定義CC環境變量?

CC=gcc-4.2 python setup.py build