解释 Clang dynamic/static 库链接过程

Explaining Clang dynamic/static library linking process

我正在构建自己的库,但我对最终可执行文件 linking 过程的工作方式感到很困惑。

我有一个使用 CoreLocation header 的 MyLibrary.framework

当我将 Mach-o type 设置为 static 时,框架构建没有问题,即使我没有 link CoreLocation.framework 在 "Linked Frameworks and Libraries".

当我 link MyLibrary.framework 到我的 iOS 测试项目时,我必须添加 CoreLocation.framework,否则我会收到未引用的符号错误。


问题

为什么构建我的静态库不需要引用 CoreLocation,为什么构建我的应用程序需要 linking 到 CoreLocation?那里发生了什么?


这里是 Mecki 的回答:

Objective-C categories in static library

很好地解释了compiling/linking过程。 .a 文件是 .o 文件的 (.a) 存档。

每个.o文件不仅包含它拥有的符号,还包含它需要的符号。

只有在可执行链接过程中,链接器才会解析可执行文件中的所有符号,这些符号引用静态库,静态库引用CoreLocation库。