gpt4 book ai didi

macos - dyld 无法加载 dylib

转载 作者:行者123 更新时间:2023-12-05 09:00:12 24 4
gpt4 key购买 nike

我有一堆动态库,我需要在运行时从应用程序包中加载它们。我注意到,如果我将我的 dylib 放在 /usr/lib 文件夹中,那么应用程序就可以加载它。我已经阅读了 install_name_tool 手册,但不知道如何让我的应用程序从 .app/contents/Frameworks 文件夹加载这些动态库。

有人可以帮我解决这个问题吗??

最佳答案

我昨天刚处理过同样的问题。

不直观的是,由于您将动态库拖到 XCode 的文件浏览器中,并且添加了一个构建阶段以将它们复制到捆绑的可执行文件中,因此链接器将“写入”应用程序以告诉它在哪里找到那些动态库。不幸的是,事实并非如此。

无论出于何种历史原因或谁知道原因,它不是从您在 XCode 中所做的事情中获取此信息,而是从 dylib 本身内部的字符串中获取此信息。 XCode 不涉及的一个,您需要使用命令行工具手动设置。

在每个动态库中都有一个名为“id”的字符串,这是程序查找动态库的路径。我认为这在链接时被复制到可执行文件中。要找出这个字符串是什么,您可以运行以下命令:

otool -L pathToMyDylib

command 输出的第一行是 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

并且必须为每个单独的依赖项重新应用。

希望对您有所帮助!

关于macos - dyld 无法加载 dylib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com