Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone &引用;未定义的建筑符号i386“;关于单元测试_Iphone_Xcode_Unit Testing_Ziparchive_Undefined Symbol - Fatal编程技术网

Iphone &引用;未定义的建筑符号i386“;关于单元测试

Iphone &引用;未定义的建筑符号i386“;关于单元测试,iphone,xcode,unit-testing,ziparchive,undefined-symbol,Iphone,Xcode,Unit Testing,Ziparchive,Undefined Symbol,只有在尝试构建iPhone静态库的单元测试时,我才会遇到以下错误: Undefined symbols for architecture i386: "std::terminate()", referenced from: -[ZipArchive dealloc] in libMyProject.a(ZipArchive.o) "___gxx_personality_v0", referenced from: Dwarf Exception Unwind Inf

只有在尝试构建iPhone静态库的单元测试时,我才会遇到以下错误:

Undefined symbols for architecture i386:
  "std::terminate()", referenced from:
      -[ZipArchive dealloc] in libMyProject.a(ZipArchive.o)
  "___gxx_personality_v0", referenced from:
      Dwarf Exception Unwind Info (__eh_frame) in libMyProject.a(ZipArchive.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
建造原项目效果良好

我会错过什么

应该注意,ZipArchive是一个.mm文件,它引用libz.dylib框架,该框架在原始项目和测试项目中都被引用

此外,通常的生成设置具有以下值:

框架搜索路径:“$(SDKROOT)/Developer/Library/Frameworks”“$(Developer\u Library\u DIR)/Frameworks”

其他链接器标志:-all_load-lxml2-ObjC


标题搜索路径:/usr/include/libxml2

这通常是由于以下两个原因之一:

  • 您将框架或系统头直接复制到项目文件夹中,而不是通过XCode添加引用
  • 您安装了多个SDK,但引用了错误的框架或标头。大多数框架不是“开发人员”框架。SenTestingKit.framework是开发人员框架的一个示例,UIKit.framework不是。奇怪的是,开发人员框架存在两个不同的地方。在XCode的/Developers/~文件夹中,以及在SDK Developers文件夹中。默认行为是引用XCode的开发者文件夹中的框架。要覆盖此选项,请在“框架搜索路径”中输入“$(SDKROOT)/Developer/Library/Frameworks”。或者,对于导入的标题或库,转到相应字段并添加“$(SDKROOT)/…”
  • 确保所有目标的搜索路径相同且正确:

    如果您使用多个SDK,可能会添加错误版本的开发人员框架(如SenTestingKit)。使用在框架搜索路径下手动输入正确的搜索路径

    $(SDKROOT)/开发人员/库/框架


    我在这里找到了解决办法


    出于某种我无法理解的原因,当静态库用于另一个项目(本例中为测试项目)时,编译器需要将
    ZipArchive.mm
    文件重命名为.m。

    原始项目中的“框架搜索路径”为空,测试项目中的值为“$(SDKROOT)/Developer/library/Frameworks”。如果我删除了在上找不到的文件,这就是我在测试项目上已经拥有的配置(请参阅问题)。如果您的意思是将其添加到原始项目中,那么我刚刚测试了它,它仍然会给我相同的错误。@hgpc您的标题搜索路径应该为空,或者应该引用SDK文件夹:$(SDKROOT)/usr/include/libxml2Header搜索路径在两个项目上都为空。然而,测试项目需要框架搜索pat来指向“$(SDKROOT)/Developer/Library/Frameworks”。在任何情况下,问题都是与静态代码中的C++代码相关的。看看我的答案。非常感谢您的帮助。请遵循以下步骤。在project的生成设置中,如果不想将.mm文件重命名为.m文件,则将
    -lc++
    添加到其他链接器标志可以解决此问题。