Mac gcc试图链接旧的,不存在的库

时间:2011-02-12 18:29:52

标签: c macos

我正在编写一个使用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库,更重要的是,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

修改

经过一番搜索后,我发现了link,您可能会觉得有用。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

感谢帮助人员。实际上,遗憾的是这些解决方案都没有奏效。经过更多的挖掘,我注意到新建的库也正在走老道路,正如'otool -L'报道的那样。我设法在libs已经构建之后使用install_name_tool -id /new/path/to/lib newly_built_lib来解决这个问题。

这似乎解决了这个问题,但是我仍然很好奇为什么这个旧的lib路径仍然在它被完全删除之后仍然存在(没有悬空的符号链接)。我也试过sudo update_dyld_shared_cache -force但没有成功。但无论如何,谢谢你的帮助。