这是一个简单的例子:
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 --version
为Apple LLVM version 8.0.0 (clang-800.0.42.1) x86_64-apple-darwin16.4.0
。
答案 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}}单独更新。