5

只有当我尝试构建 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_LIBRARY_DIR)/Frameworks”

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

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

4

2 回答 2

7

我在这篇文章中找到了解决方案。

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

于 2012-08-07T17:25:50.247 回答
4

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

  1. 您将框架或系统标头直接复制到项目文件夹中,而不是通过 XCode将其与引用一起添加
  2. 您安装了多个 SDK,并且引用了错误的框架或标头。大多数框架不是“开发者”框架。SenTestingKit.framework 是开发者框架的一个例子,UIKit.framework 不是。奇怪的是,开发人员框架存在两个不同的地方。在 XCode 的 /Developers/~ 文件夹中,以及 SDK Developers 文件夹中。默认行为是引用 XCode 的开发者文件夹中的框架。要覆盖它,请在“框架搜索路径”中输入“$(SDKROOT)/Developer/Library/Frameworks”。或者在导入的头文件或库的情况下,转到相应的字段并添加“$(SDKROOT)/...”

确保所有目标的搜索路径都相同:搜索路径

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

$(SDKROOT)/开发者/库/框架

在此处输入图像描述

于 2012-08-07T15:40:42.770 回答