1

我正在使用 worklight、一个名为 wikiitude 的增强现实插件和一个名为 sqlcipher 的框架。虽然我在为设备或存档构建时在 iOS 上运行良好,但当我尝试为模拟器构建时,会出现一个我从未见过的警告,然后是大量重复的符号错误:

ld: warning: tentative definition of '_OPENSSL_ia32cap_P' with size 8 from '/Users/mine/apps/wl/iphone/native/Frameworks/sqlcipher.framework/sqlcipher(cryptlib.o)'
is being replaced by real definition of smaller size 4 from '/Users/mine/apps/wl/iphone/native/libWikitudeSDK.a(cryptlib.o)'

然后这个错误(截断):

duplicate symbol _CRYPTO_THREADID_cmp in:
/Users/mine/apps/wl/iphone/native/Frameworks/sqlcipher.framework/sqlcipher(cryptlib.o)
/Users/mine/apps/wl/iphone/native/libWikitudeSDK.a(cryptlib.o)
.
.
.
duplicate symbol _OpenSSLDie in:
/Users/mine/apps/wl/iphone/native/Frameworks/sqlcipher.framework/sqlcipher(cryptlib.o)
/Users/mine/apps/wl/iphone/native/libWikitudeSDK.a(cryptlib.o)
ld: 33 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Wikitude 通过 libWikitudeSDK.a 包含在项目中,并且处于与库构建阶段的链接中,而 sqlcipher 是在同一位置添加的 .framework。我的其他链接器标志设置为 -ObjC ,因为当我们使用 -all_load 时,它在 wikitudeSDK 和 worklightSDK 之间导致了相同的重复符号问题。

我已按照此博客中关于如何避免重复错误的说明进行操作,但是虽然它解决了 cryptlib.o 的一个问题,但它只会打开数百个新的重复符号错误。我在构建新库时也尝试了 lipo -arch_blank i386 ,但这只会导致架构 i386 错误的未定义符号。

需要明确的是,我并没有尝试在模拟器中运行增强现实组件,我只是想使用模拟器为我的应用程序的其他方面进行开发,这些方面不依赖于维基百科。

虽然暂时从项目中删除 wikiitude 是一种选择,但项目中的版本控制只是让所有相关人员感到头疼,并引入了额外的不必要的复杂性。

提前感谢您的任何见解。

4

1 回答 1

2

我没有看到您使用的是哪个版本的 Worklight,但我认为它是 6.2 之前的版本。在 Worklight 6.2 中,-all_load 标志已替换为特定库的一系列 -force_load 标志。

您可以尝试对特定库使用 -force_load 而不是 -all_load。Worklight 6.1 的技术说明描述了如何执行此操作:Xcode linker options requirements to use FIPS 140-2 with IBM Worklight。由于您没有使用 FIPS 140-2 可选功能,因此您不会为 libfipshttp.a 添加 -force_load;您将为 libCordova.a 和 libWorklightStaticLibProject.a 添加 -force_load 并按照说明删除 -all_load。请注意,如果在链接时获得未定义的符号,您可能必须为正在使用的其他库添加 -force_load。

作为参考,这里是ios 部分下描述 Worklight 6.2 中更改的链接:Xcode 链接器选项的更改

于 2014-07-11T17:47:06.697 回答