为什么我不能在构建共享库后重命名它?

时间:2017-03-18 17:39:06

标签: macos

这是一个简单的例子:

lib.c:

#include <stdio.h>

void hello_world(void) {
  puts("Hello, world!");
}

program.c:

void hello_world(void);

int main() {
  hello_world();
  return 0;
}

如果我正常编译库并链接它,一切正常:

$ cc lib.c -fPIC -shared -o libmylib.dylib
$ cc program.c -L. -lmylib
$ ./a.out
Hello, world!

但是如果我在构建它之后重命名该库(但在构建程序之前),它就不起作用了:

$ cc lib.c -fPIC -shared -o totally_different_name.dylib
$ mv totally_different_name.dylib libmylib.dylib
$ cc program.c -L. -lmylib
$ ./a.out
dyld: Library not loaded: totally_different_name.dylib
  Referenced from: /private/tmp/./a.out
  Reason: image not found
[1]    13229 abort      ./a.out

为什么会这样?为什么dyld要查找原始库名?

这在Linux上运行正常,但是当我尝试使用macOS时,它完全失败了(我不知道它是否是一个macOS vs Linux的东西,或者是一个clang vs gcc的东西,因为我&#39; m在Mac上使用clang和在Linux上使用gcc。

如果相关,则cc --versionApple LLVM version 8.0.0 (clang-800.0.42.1) x86_64-apple-darwin16.4.0

1 个答案:

答案 0 :(得分:0)

感谢Florian Zwoch's comment,我找到了解决此问题的方法。重命名dylib后运行此命令:

install_name_tool -id <new-id> <dylib-path>

该命令会更改dylib的内部ID。命令语法为install_name_tool

最初,dylib的ID为totally_different_name.dylib。重命名文件不会更改其内部存储的ID,并且必须使用{{1}}单独更新。