2010-05-07 58 views
9

我所採取的分佈爲二進制LIB(.a)中和頭圖書館,寫了一些C++代碼反對,並希望在Python包裹起來的結果模塊。蟒蛇C擴展,在Mac OS上使用dlopen問題

我做這個here

的問題是,在Mac OSX上導入此模塊(我試過10.5和10.6)時,我得到以下錯誤:

dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr 
    Referenced from: /Library/Python/2.5/site-packages/dirac.so 
    Expected in: dynamic lookup 

這看起來像在Carbon框架定義的符號不正確解決,但我不知道該怎麼做。我提供-framework Carbondistutil.core.Extensionextra_link_args參數,所以我不知道我應該做些什麼。

任何幫助將非常感激。

更新:

通過setup.py生成的編譯行看起來是這樣的:

gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o 

的連接線看起來是這樣的:

g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon 

otool報告:

dirac.so: 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) 
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.5) 

更新2: 在MacOS 10.5,從RTLD_NOW的默認RTLD_LAZY修改dlopen的標誌解決了這個問題。但是,這在Mac OS 10.6上不起作用。

在10.6,按以下順序允許庫運行正常,雖然我不知道爲什麼:

  1. 蟒蛇的setup.py建立-v
  2. 運行連接線(由打印到控制檯setup.py),手動。
  3. 蟒蛇的setup.py安裝

我還在尋找一個很好的答案,如何得到這個正常工作。謝謝!

+1

什麼是真正的編譯器setup.py執行的命令行?刪除'build'目錄並運行'setup.py build -v'來查看。另外,'otool -L'對'dirac.so'文件說了什麼? – 2010-05-07 17:03:57

+0

@Thomas,我用這些信息更新了問題,謝謝。 – 2010-05-07 17:59:59

+0

那看起來好嗎?框架論據在被禁止的地方。我能想象的唯一事情就是你需要一個不同的框架,或者框架應該引入一個shlib依賴關係,而不是(我不知道Carbon框架是否應該這樣做)。 – 2010-05-07 20:53:57

回答

4

你會踢自己,當你看到這個問題的答案!嘗試改變這一點:

link_args = ['-framework Carbon'] if platform == 'Darwin' else [] 

這樣:

link_args = ['-framework', 'Carbon'] if platform == 'Darwin' else [] 

一旦我做了這個變化,我能夠做一個乾淨的構建並導入模塊馬上:)

+0

令人難以置信。謝謝! – 2010-05-25 18:09:54