我有一堆dylib,我需要在运行时从应用程序包加载。我注意到如果我把我的dylib放在/usr/lib
文件夹中,那么应用程序就可以加载它了。我已经通过了install_name_tool
手册,但是我还没有弄清楚如何让我的应用程序从.app/contents/Frameworks
文件夹加载这些dylib。
可以请某人帮我解决这个问题吗?
答案 0 :(得分:8)
我昨天刚刚处理了同样的问题。
你会期望的是,因为你将你的dylib拖到XCode的文件浏览器中,并且由于你添加了一个构建阶段将它们复制到你的捆绑可执行文件中,所以链接器会“写入”应用程序告诉它在哪里找到那些dylib。不幸的是,它没有。
对于任何历史或谁知道为什么的原因,它不是从您在XCode中执行的操作中获取此信息,而是从dylibs本身内部的字符串派生出来。 XCode不接触的一个,您需要使用命令行工具手动设置。
在每个dylib中都有一个名为“id”的字符串,它是程序在dylibs中查找的路径。我认为这会在链接时被复制到可执行文件中。要找出此字符串是什么,您可以运行以下命令:
otool -L pathToMyDylib
命令输出的第一行是exec在程序运行时期望它的字符串,称为“id”。我构建了一些boost库,其id的输出只是文件名。命令输出的后续行是“依赖”;这些是您的dylib可能依赖的其他库。通常,就像我的情况一样,这些库是保证在任何mac发行版中的,所以你不必担心必须纠正这些。如果他们不是这样的话;如果它们是您自己构建的库并且将要包含在您的应用程序中,那么您也必须更正这些库。所以,otool -L libboost_regex.dylib
的输出是:
libboost_regex.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)
第一行是需要更正的内容,以查看我的可执行文件。你是正确的install_name_tool
是解决这个问题的正确方法。我过去常常解决的问题是(我的终端与我的boost dylib位于同一目录中):
install_name_tool -id "@executable_path/../Frameworks/libboost_regex.dylib" libboost_regex.dylib
分别是第一个参数(在-id标志之后)是新路径,第二个参数是要修改的dylib文件。
如果你需要对其中一个依赖项进行类似的修改,你可以使用:
install_name_tool -change oldpath newpath currentfile
这必须为每个单独的依赖项重新应用。
我希望这有帮助!