我有一堆 dylib,我需要在运行时从应用程序包中加载它们。我注意到如果我把我的 dylibs 放在/usr/lib
文件夹中,那么应用程序就可以加载它。我已经阅读了install_name_tool
手册,但不知道如何让我的应用程序从.app/contents/Frameworks
文件夹中加载这些 dylib。
请问有人可以帮我解决这个问题吗?
我昨天刚刚处理了同样的问题。
不直观的是您会期望,因为您将 dylib 拖到 XCode 的文件浏览器中,并且由于您添加了构建阶段以将它们复制到捆绑的可执行文件中,因此链接器将“写入”应用程序以告诉它在哪里可以找到这些 dylib . 不幸的是,事实并非如此。
无论出于什么历史原因或谁知道原因,它不是从您在 XCode 中所做的事情中获取此信息,而是从 dylib 本身内部的字符串中获取此信息。XCode 不涉及的一种,您需要使用命令行工具手动设置。
每个 dylib 内部都有一个称为“id”的字符串,它是程序将在其中查找 dylib 的路径。我认为这会在链接时被复制到可执行文件中。要找出这个字符串是什么,您可以运行以下命令:
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
并且必须为每个单独的依赖项重新应用。
我希望这有帮助!