2013-07-16 98 views
1

我正在編譯一個SWIG包裝的C++庫到python模塊中,理想情況下這個模塊應該是可分發的,以便個人透明地像使用模塊一樣使用庫。我在OSX 10.8.2上使用cmake和swig來構建庫(系統框架 - Apple python2.7.2,安裝框架 - python.org python 2.7.5)爲python編譯共享庫

我遇到的麻煩是連接使用該框架,編譯的庫是非常有選擇正在運行的python版本,即使otool -L顯示它是使用「compatability版本2.7.0」編譯的。看來,不同的分佈略有不同的鏈接器符號和東西開始打破

最常見的問題是,它崩潰蟒蛇內核與Fatal Python error: PyThreadState_Get: no current thread(按:this question,表示聯不相容的)。我可以讓我的庫在它編譯的python中工作。

不幸的是,這個圖書館是用於學術實驗室,使用所有不同年齡段和操作系統的計算機,其中許多是永久棄用的,以便運行多年未更新的專有軟件,我當然不會沒有時間玩IT並修復所有這些問題,目前我剛剛針對最新的Enthought發行版附帶的python版本進行編譯,因爲大多數計算機都可以以這種或那種方式獲得這些版本。與我合作的許多研究人員使用一些特定於其領域的Python IDE,這些Python IDE內置了一個解釋器,但不可修改,也不是Framework構建(因此我無法構建它),暫時可以在Enthought中將他們的實驗腳本作爲一個缺口來運行,但它並不理想。即使我鏈接到與內置IDE python(2.7.2我認爲它甚至具有相同的版本號)相同版本的python.org發行版,它仍然以相同的方式打破。

在任何情況下,問題是,是否有任何方式鏈接一個SWIG包裝的Python庫,以便它將運行(至少在OSX上),而不管解釋器是如何導入它(給定某些最小條件,如保證>> = 2.7.0)。

編輯

編譯反對篷/蟒蛇在cmake的

set (CMAKE_SHARED_LINKER_FLAGS "-L ~/Library/Enthought/Canopy_32bit/User/lib -ldl -framework CoreFoundation -lpython2.7 -u _PyMac_Error ~/Library/Enthought/C\ anopy_32bit/User/lib")

otool檢查鏈接庫時,這導致@rpath符號路徑與下面的鏈接器標誌安裝的版本,似乎與其他OSX系統上的enthought/canopy正常工作,-lpython似乎是可選的,它在庫引用中添加了一個額外的python符號到osx python(不是系統py馬拉松)

編譯針對系統蟒具有以下連接標誌

set (CMAKE_SHARED_LINKER_FLAGS "-L /Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/config -ldl -framework CoreFoundation -u _PyMac_Error /Library/Frameworks/Python.framework/Versions/Current/Python")

工程在enthought和系統蟒

既不與psychopy捆綁蟒,這是在目標環境中,這些工作,與捆綁的python一起編譯,但沒有其他python。

回答

0

我已經得到相同的錯誤/有同樣的問題。如果你找到了解決方案,我會很感興趣。

我發現,如果我編譯本地python包含目錄並運行本機OS X python二進制文件/usr/bin/python,它工作得很好,總是。即使我編譯時使用了其他一些python庫(就像我在/Applications/Canopy.app/appdata/canopy-1.0.3.1262.macosx-x86_64/Canopy.app/Contents/include上找到的那個),我可以使本地OS X解釋器正常工作。

我似乎無法得到Enthought版本的工作,永遠。你在Enthought/Canopy上編譯的目錄是什麼?

也似乎是在安裝配置痛飲瞭解一個特定的Python庫的一些問題,但是這可能不相關:http://swig.10945.n7.nabble.com/SWIG-Installation-mac-osx-10-8-3-Message-w-o-attachments-td13183.html

+0

編輯了一些額外的信息,我得到了庫enthought可靠地工作,系統python,並剛剛解決了自己分發精神病用戶的單獨庫 – crasic