Iphone &引用;未定义的建筑符号i386“;关于单元测试
只有在尝试构建iPhone静态库的单元测试时,我才会遇到以下错误: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
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这通常是由于以下两个原因之一:
我在这里找到了解决办法
出于某种我无法理解的原因,当静态库用于另一个项目(本例中为测试项目)时,编译器需要将
ZipArchive.mm
文件重命名为.m。原始项目中的“框架搜索路径”为空,测试项目中的值为“$(SDKROOT)/Developer/library/Frameworks”。如果我删除了在上找不到的文件,这就是我在测试项目上已经拥有的配置(请参阅问题)。如果您的意思是将其添加到原始项目中,那么我刚刚测试了它,它仍然会给我相同的错误。@hgpc您的标题搜索路径应该为空,或者应该引用SDK文件夹:$(SDKROOT)/usr/include/libxml2Header搜索路径在两个项目上都为空。然而,测试项目需要框架搜索pat来指向“$(SDKROOT)/Developer/Library/Frameworks”。在任何情况下,问题都是与静态代码中的C++代码相关的。看看我的答案。非常感谢您的帮助。请遵循以下步骤。在project的生成设置中,如果不想将.mm文件重命名为.m文件,则将-lc++
添加到其他链接器标志可以解决此问题。