【问题标题】:Mac gcc trying to link against old, nonexistent libraryMac gcc 试图链接到旧的、不存在的库
【发布时间】:2011-02-12 18:29:52
【问题描述】:

我正在编写一个使用 TagLib 库的简单 C 程序。我最初在 /usr/local 中安装了该库,并针对它编译并链接了我的程序。我已经完全删除了这个库,并试图链接到另一个位置的库的编译版本。问题是当我现在编译我的程序时,它编译得很干净,但是在尝试运行它时,我的程序正在寻找曾经存在于 /usr/local/lib 中的库而不是新位置。例如,我的代码和新的 TagLib 库在 /Users/mdi/Code/tag 中。

我正在这样编译我的程序:

cc main.c -Wall -I./taglib/bindings/c -o tag -L./taglib/bindings/c/.libs -ltag_c

就像我说的,编译完成时没有错误或警告。但是在尝试运行二进制文件时,我收到了这个错误:

dyld: Library not loaded: /usr/local/lib/libtag_c.0.dylib
Referenced from: /Users/mdi/Code/tag/./tag
Reason: image not found
Trace/BPT trap

在二进制文件上运行“otool -L”会显示:

tag:
/usr/local/lib/libtag_c.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

为什么它仍在尝试使用 /usr/local/lib 中甚至不再存在的 TagLib 库,更重要的是,我该如何解决这个问题?

【问题讨论】:

    标签: c macos


    【解决方案1】:

    我不在 Mac 上开发,但我相信您的问题是您的库不在您的默认动态链接路径中。它因平台而异,但 /usr/local/lib 是其中常见的一个,这就是为什么它显示为您在运行时链接的路径。

    您可以更改分片库的默认搜索路径,但我不确定如何在 Mac 上执行此操作。您还应该能够在会话中设置环境变量 DYLD_LIBRARY_PATH 以强制 dyld 在搜索默认目录之前搜索其他目录。

    %>  export DYLD_LIBRARY_PATH=/path/to/your/library:$DYLD_LIBRARY_PATH
    

    在系统级别将目录添加到默认搜索路径比上面的环境变量解决方案要好,但我不知道如何在 Mac 上执行此操作。

    编辑:

    经过一番搜索,我找到了这个link,您可能会觉得它有帮助。

    【讨论】:

    • 与我的解决方案相同的想法......这是首先要测试的。如果可行,那么按照我的回答中所述将rpath 设置为库可能是永久解决方案。
    【解决方案2】:

    首先,您确定 /usr/local/bin 中没有悬空符号链接吗?然后,我不知道该库是如何编译/链接的,所以我无法告诉您如何执行此操作,但您可以尝试添加 -rpath 链接器选项。例如:

    gcc -o libtag_c.0.dylib ... -Wl,-rpath,/Users/mdi/Code/tag
    

    该选项会为库添加显式搜索路径,然后运行时链接器将在该路径中搜索库。

    【讨论】:

      【解决方案3】:

      感谢各位的帮助。实际上,不幸的是,这些解决方案都没有奏效。经过更多的挖掘,我注意到新构建的库也在使用旧路径,正如“otool -L”所报告的那样。在它们已经构建后,我设法通过在库上使用 install_name_tool -id /new/path/to/lib newly_built_lib 来解决这个问题。

      这似乎解决了问题,但我仍然很好奇为什么这条通往 lib 的旧路径即使在完全删除后仍然存在(没有悬空的符号链接)。我也试过sudo update_dyld_shared_cache -force,但没有成功。不过还是谢谢你的帮助。

      【讨论】:

      • 好的,现在我想我开始明白了。我认为正在发生的事情是安装路径(如果我要执行 make install,则安装 lib 的位置)是 otool -L 报告的 lib 中显示的内容。
      猜你喜欢
      • 2023-01-09
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      相关资源
      最近更新 更多