【问题标题】:"Undefined symbols for architecture i386" on unit tests单元测试中的“架构 i386 的未定义符号”
【发布时间】:2023-03-24 13:55:02
【问题描述】:

仅当我尝试构建 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

【问题讨论】:

    标签: iphone xcode unit-testing ziparchive undefined-symbol


    【解决方案1】:

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

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

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

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

    $(SDKROOT)/Developer/Library/Frameworks

    【讨论】:

    • “框架搜索路径”在原始项目中为空,在测试项目中的值为“$(SDKROOT)/Developer/Library/Frameworks”。如果我删除我在 上找不到文件。
    • 这是我在测试项目中已经拥有的配置(见问题)。如果您的意思是将它添加到原始项目中,那么我只是对其进行了测试,它仍然给我同样的错误。
    • @hgpc 您的标头搜索路径应该是空白的,或者应该引用 SDK 文件夹:$(SDKROOT)/usr/include/libxml2
    • 标头搜索路径在两个项目中都是空白的。但是,测试项目需要 Framework Search Pats 指向“$(SDKROOT)/Developer/Library/Frameworks”。无论如何,问题与静态库中的 C++ 代码有关。看我的回答。非常感谢您提供帮助。
    【解决方案2】:

    我在post 中找到了解决方案。

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

    【讨论】:

    • 关注此issue。在项目的 Build Settings 中,如果您不想将 .mm 文件重命名为 .m 文件,将 -lc++ 添加到 Other Linker Flags 可以解决此问题。
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2011-10-30
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多