2013-10-22 56 views
0

我有一個應用程序,我想要捆綁一個特定的dylib。 我使用「dylibbundler」將dylib和依賴關係複製到可執行文件夾。以下是我正在使用的命令:使用單聲道可執行文件打包.dylib文件

dylibbundler -od -b -x /opt/local/lib/libil.dylib -d ./libs/ -p @executable_path/libs/ 

dylibbundler與可執行文件位於同一目錄中。該工具在庫及其所有依賴項上遞歸運行「install_name_tool」(並將它們複製到指定的目錄中)。在./libs/libil.1.dylib返回運行otool -L:

@executable_path/libs/libIL.1.dylib (compatibility version 3.0.0, current version 3.0.0) 
@executable_path/libs/libtiff.5.dylib (compatibility version 8.0.0, current version 8.0.0) 
@executable_path/libs/liblzma.5.dylib (compatibility version 6.0.0, current version 6.4.0) 
@executable_path/libs/libpng15.15.dylib (compatibility version 30.0.0, current version 30.0.0) 
@executable_path/libs/libmng.1.dylib (compatibility version 2.0.0, current version 2.0.0) 
@executable_path/libs/liblcms.1.dylib (compatibility version 2.0.0, current version 2.19.0) 
@executable_path/libs/libjasper.1.dylib (compatibility version 2.0.0, current version 2.0.0) 
@executable_path/libs/libjpeg.9.dylib (compatibility version 10.0.0, current version 10.0.0) 
@executable_path/libs/libIlmImf.6.dylib (compatibility version 7.0.0, current version 7.0.0) 
@executable_path/libs/libImath.6.dylib (compatibility version 7.0.0, current version 7.0.0) 
@executable_path/libs/libHalf.6.dylib (compatibility version 7.0.0, current version 7.0.0) 
@executable_path/libs/libIlmThread.6.dylib (compatibility version 7.0.0, current version 7.0.0) 
@executable_path/libs/libIex.6.dylib (compatibility version 7.0.0, current version 7.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
@executable_path/libs/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7) 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 

在我看來,它已經在正確複製的一切。但是,當我跑我的申請,我不斷收到同樣的異常:

Unhandled Exception: System.DllNotFoundException: ./libs/libIL.1.dylib 
Unhandled Exception: System.DllNotFoundException: @executable_path/libs/libIL.1.dylib 
Unhandled Exception: System.DllNotFoundException: libs/libIL.1.dylib 

正如你所看到的,我已經嘗試了3種不同的參考圖書館的方式,但它始終沒有找到它。

任何幫助將不勝感激,我幾個月來一直在努力解決這個問題。

UPDATE: 如果我指定的dylib的絕對路徑,它發現它,但後來抱怨的依賴關係:

Mono: DllImport error loading library 'dlopen(/Users/me/myapp/libs/libil.1.dylib, 9): Library not loaded: @executable_path/libs/libtiff.5.dylib 
    Referenced from: /Users/me/myapp/libs/libil.1.dylib 
    Reason: image not found'. 

在我看來,那@executable_path沒有被取代,實際的絕對可執行路徑。

回答

2

請記住,本機可執行文件不是myapp.exe,它是單聲道二進制文件。

嘗試設置DYLD_LIBRARY_PATH,如其他答案中所述(注意,在執行應用程序之前必須對其進行設置,因爲動態庫加載程序在應用程序加載到內存中時讀取此值,在執行Main方法之前執行) 。

+0

我也有一個想法,@executable_path指向單聲道二進制。但是,下面的問題說,executable_path完全適用於單聲道應用程序:http://stackoverflow.com/questions/14536843/including-custom-dll-and-dylib-in-monomac-app有什麼想法? –

+1

我依賴於你如何構建和執行你的應用程序。如果您使用的是MonoMac/Xamarin.Mac項目,那麼該答案是正確的(因爲構建過程將構建自定義啓動器並將libmono鏈接到它,而不是使用單聲道二進制本身),否則它不是。 –

1

因爲我實際上是一個Linux的傢伙,不知道考慮OSX動態庫以及dylibbundler工具的確切結果是什麼,我無法確切地告訴某些事情。然而,在Linux上,這些庫在LD_LIBRARY_PATH變量的入口路徑中搜索(等等)。 OSX相當於DYLD_LIBRARY_PATH。您可以嘗試將此變量設置爲包含庫的目錄。

相關問題