我正在編譯一個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。
編輯了一些額外的信息,我得到了庫enthought可靠地工作,系統python,並剛剛解決了自己分發精神病用戶的單獨庫 – crasic