我所採取的分佈爲二進制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 Carbon
到distutil.core.Extension
的extra_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,按以下順序允許庫運行正常,雖然我不知道爲什麼:
- 蟒蛇的setup.py建立-v
- 運行連接線(由打印到控制檯setup.py),手動。
- 蟒蛇的setup.py安裝
我還在尋找一個很好的答案,如何得到這個正常工作。謝謝!
什麼是真正的編譯器setup.py執行的命令行?刪除'build'目錄並運行'setup.py build -v'來查看。另外,'otool -L'對'dirac.so'文件說了什麼? – 2010-05-07 17:03:57
@Thomas,我用這些信息更新了問題,謝謝。 – 2010-05-07 17:59:59
那看起來好嗎?框架論據在被禁止的地方。我能想象的唯一事情就是你需要一個不同的框架,或者框架應該引入一個shlib依賴關係,而不是(我不知道Carbon框架是否應該這樣做)。 – 2010-05-07 20:53:57