我正在使用worklight,一个名为wikitude的增强现实插件和一个名为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之间引起了相同的重复符号问题。
我已经按照this blog的说明进行操作,如何避免重复错误,但是虽然它解决了cryptlib.o的一个问题,但它却打开了数百个新的重复符号错误。在构建新库时,我还尝试了lipo -arch_blank i386,但这只会导致体系结构i386错误的未定义符号。
需要明确的是,我并不是要在模拟器中运行增强现实组件,我只是想使用模拟器为我的应用程序的其他方面开发,而这些方面不依赖于变态。
虽然可以暂时删除项目中的变态,但是项目中的版本控制只会使所有相关人员感到头疼,并且会带来不必要的额外复杂性。
预先感谢您的任何见解。
最佳答案
我没有看到您使用的是哪个版本的Worklight,但我认为它是6.2之前的版本。在Worklight 6.2中,-all_load标志已替换为特定库的一系列-force_load标志。
您可以尝试将-force_load用于特定的库,而不是-all_load。有一个针对Worklight 6.1的技术说明,描述了如何执行此操作:Xcode linker options requirement to use FIPS 140-2 with IBM Worklight。由于您没有使用FIPS 140-2可选功能,因此不会为libfipshttp.a添加-force_load;否则,将不添加-force_load。您将为libCordova.a和libWorklightStaticLibProject.a添加一个-force_load,并按照所述删除-all_load。请注意,如果在链接时出现未定义的符号,则可能必须为正在使用的其他库添加-force_load。
作为参考,下面的链接描述了ios: Changes in Xcode linker options部分下Worklight 6.2中的更改。
关于ios - iOS模拟器使用Worklight,Wikitude和sqlcipher框架生成错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24687330/