为iOS设备成功构建但是为iOS模拟器构建错误

时间:2014-11-20 07:11:54

标签: ios xcode ios-simulator static-libraries

我一直面对这个挥之不去的问题。当我尝试通过在我的Xcode中选择iOS设备来构建项目时,它会构建代码而不会出现任何错误,但是当我尝试使用iOS模拟器时它会显示以下错误。我在模拟器中构建时有没有办法避免这个库文件?我也尝试了以下链接,但我无法找到确切的解决方案。

提前致谢。

6 duplicate symbols for architecture i386

ld: warning: ignoring file /Users/iOS-MobileTeam/Downloads/iOS/LibraryFiles/libANMobilePaymentLib.a, missing required architecture i386 in file /Users/iOS-MobileTeam/Downloads/iOS/LibraryFiles/libANMobilePaymentLib.a (2 slices)
    duplicate symbol _des_set_key in:
        /Users/iOS-MobileTeam/Downloads/iOS/LineaSDK/libdtdev.a(des-524F6BE9122BCA82.o)
        /Users/iOS-MobileTeam/Downloads/iOS/LineaSDK/libdtdev.a(des-D9CE0CBEE0B3BA81.o)
    duplicate symbol _des_encrypt in:
        /Users/iOS-MobileTeam/Downloads/iOS/LineaSDK/libdtdev.a(des-524F6BE9122BCA82.o)
        /Users/iOS-MobileTeam/Downloads/iOS/LineaSDK/libdtdev.a(des-D9CE0CBEE0B3BA81.o)
    duplicate symbol _des_decrypt in:
        /Users/iOS-MobileTeam/Downloads/iOS/LineaSDK/libdtdev.a(des-524F6BE9122BCA82.o)
        /Users/iOS-MobileTeam/Downloads/iOS/LineaSDK/libdtdev.a(des-D9CE0CBEE0B3BA81.o)
    ld: 3 duplicate symbols for architecture i386
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    Ignoring file /Users/iOS-MobileTeam/Downloads/iOS/LibraryFiles/libANMobilePaymentLib.a, missing required architecture i386 in file /Users/iOS-MobileTeam/Downloads/iOS/LibraryFiles/libANMobilePaymentLib.a (2 slices)

3 个答案:

答案 0 :(得分:2)

静态库已损坏,因为它包含两个包含相同符号(函数)的独立目标文件。

必须重建它,或者如果您没有可以解压缩的源,请删除有问题的文件,然后重新打包(未经测试):

$ mv libdtdev.a libdtdev-old.a
$ mkdir xxx
$ cd xxx
$ ar x ../libdtdev-old.a
$ rm des-D9CE0CBEE0B3BA81.o
$ ar cr ../libdtdev.a *.o
$ cd ..
$ rm -rf xxx

但是,如果静态库包含多个体系结构,那么很多会更复杂。

答案 1 :(得分:0)

问题是您的libANMobilePaymentLib.a静态存档未正确构建。如果这是第三方库,您应该要求作者提供解决此问题的更新版本,并且trojanfoe关于解压缩和重新打包存档的说明没有一个des实现可能是临时解决方法的最佳选择。

如果您自己构建了库或想要将信息传递给作者,则问题是库的i386片包含des_set_key,des_encrypt和des_decrypt符号的副本。我怀疑这是由于在构建libANMobilePaymentLib.a时意外包括des.c两次造成的。另一种可能性是libANMobilePaymentLib.a的作者希望这些函数是静态的而不是导出的。

答案 2 :(得分:-1)

最后我找到了解决上述问题的方法。所有的功劳归于@Khanh

How to ignore some static library for iOS simulator

以上链接帮助我解决了这个问题。

解决问题的步骤:

  1. 转到“项目构建设置”并搜索其他链接器标志。 2.Expand其他链接器标志部分。将有两种模式调试发布
  2. 将光标放在调试模式上,将出现一个+符号。
  3. 点击加号。
  4. 将添加一个新选项,例如任何架构|任何SDK
  5. 任意SDK 更改为任何iOS模拟器SDK
  6. 任何iOS模拟器SDK设置 -objC
  7. enter image description here