[英]How to make Mac OS application find private dynamic library?
對於Mac OS X,我已經手動創建了一個應用程序目錄foo.app/
,其中包含以下文件:
Info.plist
Contents/MacOs/foo
Frameworks/libbar.dylib
文件foo
是起始可執行文件,它是使用Makefile從C ++編譯的。 文件libbar.dylib
的ID設置為使用;
install_name_tool -id @rpath/libbar.dylib libbar.dylib
當我從Finder啟動應用程序時,我得到:
Dyld Error Message:
Library not loaded: @rpath/libbar.dylib
Referenced from: /private/tmp/foo.app/Contents/MacOS/foo
Reason: image not found
顯然,我需要在捆綁包中放置一些東西,以告訴加載器在哪里可以找到libbar.dylib
。 解決問題的最佳方法是什么?
一個非常幼稚的方法是將Contents / MacOs / foo重命名為foo2並在同一目錄中創建一個新文件foo,該目錄基本上是:
./foo2 —-load-lib /path/to/lib
但是為了做到這一點,應用程序必須支持這種功能。
[在JWWalker的回答啟發了我之后更新。]
工具install_name_tool
提供了一個解決方案:使用它可以將@loader_path/../Frameworks
添加到foo
的rpath中,如下所示:
$ cd foo.app/Contents/MacOS
$ install_name_tool -add_rpath @loader_path/../Frameworks foo
鏈接foo
工具時,需要告訴它@rpath
含義。 當我查看由Xcode項目生成的命令行時,我看到了提供給clang ++的選項:
-Xlinker -rpath -Xlinker "@loader_path/../Frameworks"
假定Frameworks通常是Contents的子文件夾,而不是您所指定的同級文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.