我只是调查了一下,并认为其他一些人可能对我的发现感兴趣。
与weak_import 的弱链接实际上只适用于动态库。您可以让它与静态链接一起工作(通过指定 -undefined dynamic_lookup 如上所述)但这不是一个热门的想法。这意味着在运行之前不会检测到未定义的符号。这是我个人在生产代码中会避免的事情。
这是一个 Mac OS X 终端会话,展示了如何使其工作:
这里是 fc
int f(int n)
{
return n * 7;
}
这是whatnof.c
#include <stdio.h>
#include <stdlib.h>
extern int f (int) __attribute__((weak_import));
int main() {
if(f == NULL)
printf("what, no f?\n");
else
printf("f(8) is %d\n", f(8));
exit(0);
}
从 fc 创建一个动态库:
$ cc -dynamiclib -o f.dylib f.c
针对动态库编译和链接,列出动态库。
$ cc -o whatnof whatnof.c f.dylib
$ otool -L whatnof
whatnof:
f.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
运行 whatnof 看看会发生什么:
$ whatnof
f(8) is 56
现在将 f.dylib 替换为空库(无符号):
$ mv f.dylib f.dylib.real
$ touch null.c
$ cc -dynamiclib -o f.dylib null.c
运行同样的 whatnof 看看会发生什么:
$ whatnof
what, no f?
weak_import 的基本思想(或“用例”)是它允许您链接一组动态(共享)库,然后针对相同库的早期版本运行相同的代码。您可以对照 NULL 检查函数,以查看它们是否在当前运行代码的特定动态库中受支持。这似乎是 Xcode 支持的基本开发模型的一部分。我希望这个例子有用;它有助于让我对 Xcode 设计的这一部分放心。