我已經建立了一個32位的dylib的OS X與德爾福XE2 UPD使用。 3.它的安裝名稱使用@rpath。所有導出都以下劃線開頭,並通過otool進行驗證。出口在Delphi中使用「cdecl」調用約定。名爲.dylib不能用Xcode的應用程序
我不能得到這個dylib與OS X 10.7.3運行在Xcode 4.3 32位主機應用程序的工作。當我在Xcode中運行測試項目,它停止與調用調用堆棧的lib和dyld_start。
當我運行從搜索這個應用程序(從用戶庫中的Xcode的文件夾),我得到的圖像不從dyld的找到錯誤。
我已經添加了副本構建階段,其副本(它需要和libcgunwind.1.0.dylib)的dylib進入產品目錄。我還將Runpath Search Paths設置爲@executable_path或@loader_path,都無濟於事。
的方法是通過
extern int TestLib(int AInt);
庫中導入是最小的,因爲它可以得到,只是包含此單元:
unit LibTestExports;
uses
System.Classes,
System.SysUtils;
function _TestLib(AInt: Integer): Integer; export; cdecl;
begin
Result:= AInt + 2;
end;
exports
_TestLib;
end.
我出的是什麼原因造成這樣的想法和我如何才能讓這個工作。
Xcode項目和庫可以在這裏找到:http://dl.dropbox.com/u/17403534/CAS4LibTest.zip
UPDATE:這個問題似乎是獅子專用!它使用Xcode 4.2在Snow Leopard 10.6.4中正常工作。 (Lion上的Xcode 4.2會導致同樣的問題)
在FireMonkey應用程序使用Lion時,同樣的dylib也可以正常工作(這些方法是使用external 'libName'
靜態導入的)。
運行獅子在相同的應用程序,即雪豹下正常工作,我得到一個包含以下調用堆棧崩潰報告:
0 ??? 0x0013317c 0 + 1257852
1 libCAS4.dylib 0x00010b5c @DbgEvalFrame + 1648
2 libCAS4.dylib 0x00010e1a @DbgEvalFrame + 2350
3 dyld 0x8fe55203 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 251
4 dyld 0x8fe54d68 ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 64
5 dyld 0x8fe522c8 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 256
6 dyld 0x8fe5225e ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 150
7 dyld 0x8fe53268 ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 62
8 dyld 0x8fe47694 dyld::initializeMainExecutable() + 214
9 dyld 0x8fe4bf99 dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) + 2238
10 dyld 0x8fe452ef dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*) + 637
11 dyld 0x8fe45063 _dyld_start + 51
解決方法: Embarcadero的支持,現在有一種變通方法,修復回來我的問題:在System.Classes的本地副本GlobalNameSpace的聲明中更改:IReadWriteSync到合適的班級在初始化部分使用。
nm:對象:libLibTest.dylib格式錯誤的對象(偏移量爲509728的間接表,大小爲576,與偏移量爲507904的段內容重疊,大小爲67082) ...測試庫是否有效? – Petesh 2012-02-13 19:21:16
我希望圖書館是有效的,但我不確定。如果不是這樣,那意味着Delphi XE2會被嚴重破壞,因爲這是最基本的代碼轉換成庫。其實我也注意到nm認爲這個庫是無效的,但後來看到otool輸出的輸出很好。 – msohn 2012-02-13 22:28:58
請記住,nm,otool和dyld使用不同的代碼來讀取文件中的相關元素。 nm的抱怨可能是dyld調用失敗的原因。我使用IDA來反彙編TestLib調用,它看起來像一個int *作爲參數,而不是int。這會在調用時導致訪問衝突的副作用;但它看起來像之前發生的錯誤(在圖書館加載時間) – Petesh 2012-02-14 09:08:51