0

我有一个编译的程序mybinary,当我尝试运行它时,它会立即失败并显示“找不到图像”。问题不是丢失的动态库的路径,而是它需要查看不包含版本号的库名称。

在执行时mybinary,我得到了这个(为简洁而编辑):

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuuc.68.dylib
Reason: image not found

运行otool -L mybinary显示了这一点(为简洁起见也进行了编辑):

/usr/local/opt/icu4c/lib/libicuuc.68.dylib

我希望它在libicuuc.dylib没有“.68”的情况下查看。一个ls -1表明它存在:

/usr/local/opt/icu4c/lib/libicuuc.69.1.dylib
/usr/local/opt/icu4c/lib/libicuuc.69.dylib
/usr/local/opt/icu4c/lib/libicuuc.a
/usr/local/opt/icu4c/lib/libicuuc.dylib

因为引用的版本mybinary是 68(低于 69,从而防止Incompatible library version),我可以mybinary通过执行以下来修复:

sudo install_name_tool -change /usr/local/opt/icu4c/lib/libicuuc.68.dylib /usr/local/opt/icu4c/lib/libicuuc.dylib mybinary

现在,mybinary启动就好了。

不过,目标是修改Makefileformybinary使其链接到libicuuc.dylib. 我怎样才能做到这一点?

mybinary在 tar 文件中部署给最终用户,与 tar 文件(在本例中为 68)相比,他们更有可能拥有更新版本的 icu4c(在本例中为 69 mybinary)。

  1. 有没有办法在编译时告诉链接器我想使用libicuuc.dylib(文件名中没有版本号)?如果此行为随后应用于其他链接库会很好,即我不需要将它专门用于libicuuc.dylib.

  2. 如果那不可能,我可以Makefile修改. 它不是编译控制台输出的一部分,解析输出会很混乱。有没有简单而优雅的方式来传递给?install_name_toollibicuuc.68.dylibotool -L mybinarylibicuuc.68.dylibinstall_name_tool

4

0 回答 0