引用的库(默认情况下)不包含在静态库产品中。您看到的链接器冲突更有可能是您的静态库和客户端应用程序都使用默认(隐式)Pod 目标的结果。
每个 Cocoapods 生成的目标都包含一个编译到产品中的“Pods-target-dummy.m”文件;如果你使用默认的 Pods 目标,它就叫做“Pods-dummy.m”。当库和客户端都使用默认目标时,编译虚拟文件产生的相同符号将导致链接错误。
我自己尝试了Craig 答案的变体,发现该link_with
语句还负责连接 Cocoapods 生成的 xcconfig,它提供了控制标头搜索路径的编译器标志。当然,您可以手动添加 xcconfig(或标题搜索路径项目设置),但我一直在为我的团队寻找可重复的解决方案。
我的解决方案是为库创建一个显式目标,其名称不太可能与客户端项目发生冲突(例如,库的名称):
target 'XYZLibrary' do
pod 'AFNetworking', '2.5.2'
...
end
如果静态库目标的名称(在您的 Xcode 项目中)不同,您可以在块中包含一条link_with
语句target
,但如果只有一个目标,我通常更喜欢在两个地方使用相同的名称,这样就link_with
没有必要了。
如果您有一个单元测试目标,请创建两个单独的目标。(我目前def
有一组用于两个目标的通用 pod,因为抽象目标目前不是一个选项,但它们可能有一天会出现。)它看起来像这样:
def common_pods
pod 'AFNetworking', '2.5.2'
end
target 'XYZLibrary' do
common_pods
end
target 'XYZLibraryTests' do
common_pods
end
关键是 Podfile 的根目录中不要有任何pod
元素,这样 Cocoapods 就不会生成默认目标。这样,每个产品都会获得一个唯一的“Pods- target -dummy.m”,并且当这些目标文件链接在一起时不会发生冲突。