重复符号错误:带有 Objective-Zip、ZLib、MiniZip 的 Flurry SDK 5.0.0
Posted
技术标签:
【中文标题】重复符号错误:带有 Objective-Zip、ZLib、MiniZip 的 Flurry SDK 5.0.0【英文标题】:Duplicate symbol Error : Flurry SDK 5.0.0 with Objective-Zip, ZLib, MiniZip 【发布时间】:2014-04-30 22:53:28 【问题描述】:Objective-Zip
、ZLib
和 MiniZip
使用 Flurry 5.0.0
编译失败并出现 34 duplicate symbols for architecture i386
。
报告了重复的符号
_zipOpen , _unztell, _unzSetOffset, _unzClose
等
当Flurry 4.3.2
用于XCode 5.0
时,相同的项目编译良好
有人遇到过这个问题吗?有什么办法吗?
【问题讨论】:
【参考方案1】:我遇到了这个问题,因为 FlurryAds 5.0.0 在内部使用 ZipArchive,但我们也在自己的应用程序中使用 ZipArchive(通过 Cocoapods)。这可能是由于使用了 Flurry 使用的任何与 zip 相关的库。
如果您在应用中的任何位置使用 ZipArchive 及其依赖项,则会出现冲突,因为您的 ZipArchive 副本和 FlurryAds 的 ZipArchives 副本都定义了相同的符号。
这是一个 Objective-C 的问题,因为 Objective-C 不支持命名空间,这会让两个副本一起存在。
你也可以责怪 Flurry,因为他们在分发二进制库时没有为其依赖项添加前缀(即 FlurryZipArchive
,前缀是命名空间的替代方法)。
目前不完美的解决方案是从目标中删除ZipArchive.m
、ioapi.c
、mztools.c
、unzip.c
和zip.c
。
您仍然可以导入 ZipArchive.h
并使用它,但这有点危险,因为我们不知道 ZipArchive FlurryAds 正在使用哪个版本(或者他们是否可能已对其进行了修改),因此我们无法确定我们的头文件与它们在库中定义的符号兼容。
可能没问题,Flurry 可能正在使用最新版本并且没有修改它。
但是,我们应该要求 Flurry 使 ZipArchive 成为显式的外部依赖项(这样我们就可以共享一个安装和 ZipArchive 的一个标头),或者为 ZipArchive 添加前缀,这样它就不会影响其他依赖项。
【讨论】:
您也可以从链接器标志中删除“-ObjC”以避免冲突,但毫无疑问,您有充分的理由将其放在那里。这个 SO 答案涵盖了 -ObjC 标志的替代方案:***.com/questions/11254269/…。如果 Flurry 可以为库添加前缀,那么实现通常会更容易。 Flurry 已经确认前缀没有进入 5.2,但应该在 5.3 中,所以这个问题应该会消失【参考方案2】:您需要添加另一个框架。您需要在新的 Flurry 5.0.0 中添加一个额外内容。它是关于以下框架:
libz.dylib
编辑:
尝试从构建过程中排除这些文件:ioapi.c/.h mztools.c/.h unzip.c/.h zip.c/.h ZipArchive.mm/.h crypt.h
祝你好运!
【讨论】:
'libz.dylib' 已经存在。这是“重复符号”错误。您的解决方案将适用于“未找到符号”错误。 @danfelabs 添加了 Flurry 自己的另一个解决方案。使用新 SDK 时出错。【参考方案3】:我遇到了同样的问题。
重命名 unzip.h 和 unzip.m(对于 MiniZip) - 对我有帮助。
【讨论】:
【参考方案4】:我在不使用Flurry
的情况下遇到了同样的问题。我使用 cocoapods
并添加了 ZipArchive
和 objective-zip
库作为依赖项。我的项目build settings
:-all_load
的Other-Linker-Flags
有超额价值。
我的目标在其Other Linker Flags
中只有$(inherited)
值,因此-all_load
标志是从项目设置中隐式添加的。这就是那些链接器错误的原因
【讨论】:
以上是关于重复符号错误:带有 Objective-Zip、ZLib、MiniZip 的 Flurry SDK 5.0.0的主要内容,如果未能解决你的问题,请参考以下文章
从 C++ 连接 MySQL:错误 LNK2001:未解析的外部符号 [重复]