簡體   English   中英

如何使Mac OS應用程序查找私有動態庫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM