我目前有一个非常大的代码库的Xcode项目,我称之为Project X,我将其划分为一堆子项目(项目A,B,C).
到目前为止,这些项目中的每一个都可以自行编译.它们都产生静态库.项目B和项目C依赖于项目A生成的静态库以进行构建.
我有另一个xcode项目,Project Z,它需要Projects B和C生成的静态库.这就是问题所在.当Project Z进入链接器阶段时,事情就会爆发 - 在项目B和C的库中找到重复的符号,用于它们最初在项目A中链接的代码!
我对静态库世界很陌生,我不确定如何推进Project Z,或者如何修改其他项目以便它们链接到同一个Project A lib.我觉得这是不可能的.我有什么选择?
编辑:
我应该澄清,项目B和项目C需要构建成单独的静态库,因为一些客户端只需要一个或另一个.
此外,我在OSX和iOS平台上都遇到了这种困境.
我意识到我可以通过将项目构建为动态库来解决OSX上的这个问题.但是,我不想这样做,它仍然让我在iOS上遇到同样的问题.
我有一个动态框架,它链接到谷歌地图(据我所知,它仍然是一种静态库,如果不是那样,只需要一个框架包装器).
问题是框架链接到静态库并且似乎也直接包含其代码,因为我不需要在使用框架的应用程序中链接或嵌入Google Maps,一切正常.除非我在应用内部使用Google地图.
要么在编译阶段我得到"架构XY的未定义符号",要么我将谷歌地图链接到它,然后我在app-launch期间在调试控制台中收到警告墙,如:
类GMSPolyline2D在/.../Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework和/..../Bundle/Application/7C73324B-4A42-4063-98AA-879345997DE6/MyApp.app/MyApp中实现.将使用两者之一.哪一个未定义.
有没有办法只在框架中链接谷歌地图,但不包括框架产品中的符号?它适用于动态框架,但静态库似乎只是包含在内.我已经尝试使用-weak_framework和弱连接-weak_library,但它似乎不起作用.
实际上,我无法让Xcode -weak_library在其框架目录中找到GoogleMaps二进制文件,即使在.framework文件夹中直接链接为Library Search Path也是如此.
由于我是我框架的唯一用户,因此我可以强制执行使用框架DOES的每个应用程序都包含Google Maps框架.到目前为止,除了警告之外,应用程序工作正常(到目前为止,在运行时使用哪两个类无关紧要,因为两者都应该相同).但是,如果有更好的解决方案,我会睡得更好:)
编辑:我可以通过直接在linker-flag部分中移交绝对路径而不是使用Library Search Path设置来使-weak_library工作.但问题仍然存在,显然它仍然包含在框架中.
为什么恰好是它,当我在Xcode中创建一个iOS的静态库项目或框架项目,我不需要为了使用它们的标题和对象的任何iOS版SDK框架链接到项目-例如,我可以#import <AudioToolbox/AudioToolbox.h>并将AudioToolbox代码放在静态库或框架中,而无需在构建设置中的"Link Binary with Libraries"下添加AudioToolbox或将其存在于文件导航器中,并且项目将无问题地构建,这在某些情况下无效应用程序项目 - 但是当开发人员在应用程序中使用静态库或框架产品时,他们必须链接到框架才能使用相同的标头和对象?
我有一个模糊的想法,为什么会这样,但我真的很想听到一个肯定知道的人.
我目前在我的项目中有ShareKit,它被编译为静态库.它已得到妥善实施.我还通过将他们的框架添加到我的项目中来实现亚马逊的AWS SDK.
似乎重复的符号来自亚马逊的AWS SDK文件"AWSIOSSDK".这就是它的样子:

该文件与ShareKit的文件libShareKit.a发生冲突.这是该文件的样子:

无论如何,这些文件都是我以前从未见过的文件.似乎有些JSON文件在它们之间发生冲突.
我已经查看了其他SO问题,并且他们说要使用已编译的源代码执行某些操作,但这些文件都不在任何库的编译源中.
这是Xcode给出的确切错误:
ld: duplicate symbol _OBJC_CLASS_$_SBJsonParser
Run Code Online (Sandbox Code Playgroud)
无论如何,有没有人有任何想法我应该做什么?除非我解决这个问题,否则我的应用程序无法编译
谢谢!
xcode ×3
ios ×2
objective-c ×2
cocoa-touch ×1
duplicates ×1
gcc ×1
linker ×1
llvm ×1
sbjson ×1
symbols ×1