由于您的目标是 OSX,因此您的问题的解决方案是将 Lumberjack 构建为一个框架(而不是链接 A 和 B 模块中的源代码),然后在需要的任何地方使用该框架(即,在任何使用 A 或B 模块)。
事实上,Lumberjack 已经包含一个将构建 Lumberjack.framework 的项目,请检查:CocoaLumberjack/Xcode/LumberjackFramework/Desktop/Lumberjack.xcodeproj
.
详细说明这一点,您将像现在一样定义 A 和 B 模块,但不会将 Lumberjack 源代码放入其中。相反,您所做的是,每当您想在可执行文件(例如,您的测试目标)中使用 A 静态库时,将该库添加到目标以及 lumberjack 框架(就像您使用 OSX SDK 框架一样)。
如果需要,添加动态框架只是“删除源”的另一种方式,但要正确完成。
当您想在 C 项目中同时使用A 和 B 时,将静态库和 Lumberjack 框架都添加到 C 中。
如您所见,这种做法将符合您的所有四个要求,但会引入一个依赖项:您需要在静态库文档中明确说明它们依赖于 Lumberjack 框架。这实际上不是一个大问题,因为后者可以在自己的项目中使用,任何人都可以自己构建它。
如果您想改进此依赖项的处理,cocoapods 是您的最佳选择(cocoapod 是与您的库关联的文件,用于描述其依赖项,因此当您安装库时,cocoapods 系统也会自动安装依赖项) . 但这是高度可选的。一个单一的依赖关系不是一个需要记录或遵守的大问题。
希望这能回答你的问题。