架构为armv7的未定义符号

320

这个问题一直困扰着我,我无法解决它...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

我认为这与以下内容有关:

ld: symbol(s) not found for architecture armv7

但是我已经添加了:libz.1.2.3.dylib,但没有帮助,有人有任何想法吗?


1
另一个可能性是,您可能正在使用-ObjC其他链接器标志,因此来自您使用的外部静态库的Obj-C(例如来自Parse的库)是可见的,但不应该可见。如果是这种情况,请参阅我的答案:https://dev59.com/WGw15IYBdhLWcg3wu-M9#26151208 - ArtOfWarfare
2
作为经验法则,有时候在 XCode 中会出现一些错误,比如 Mach-O 和符号在 i386 (或其他) 架构中未找到,这通常是由于文件未添加到项目中引起的。您可以右键单击项目文件夹,然后选择“添加文件到<项目>”来解决问题。 - Rudolf Real
你可以使用nm工具实际查看生成的具体符号。在终端中进入.o文件所在路径,运行nm -g命令来检查调用符号的文件和应该有该符号的文件是否匹配,这可以为错误提供线索。nm -g file.o你可以使用以下命令来查看C++符号的反汇编:nm -gC file.o - James Alvarez
有没有人可以帮帮我?我遇到了以下错误,但以上所有解决方案都对我无效。我已经花了几天时间尝试所有可能的设置。Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) - red-devil
我用以下方法修复了类似的错误:https://dev59.com/M8Hqa4cB1Zd3GeqPuzdY#73011491 - Taras
40个回答

512

常见原因

"Undefined symbols for architecture armv7" 的常见原因有:

  1. 导入了一个头文件,但没有链接到正确的库文件。这很常见,尤其是对于像 QuartzCore 这样的库的头文件,因为它不会默认包含在项目中。解决方法:

    • Build PhasesLink Binary With Libraries部分中添加正确的库。

    • 如果你想添加一个默认搜索路径之外的库,可以在 Build Settings 中的 Library Search Paths 值中包含该路径,并在Build SettingsOther Linker Flags 部分中添加
      -l{library_name_without_lib_and_suffix}(例如对于 libz.a 使用 -lz)。

  2. 将文件复制到项目中,但忘记勾选将文件添加到目标中。解决方法:

    • 打开正确目标的Build Phases,展开Compile Sources并添加缺少的.m文件即可。如果这是你的问题,请同时点赞Cortex 的答案

  3. 包含了一个为其他架构(如 i386,主机上的模拟器)构建的静态库。解决方法:

    • 如果你有多个来自库供应商的库文件需要包含在项目中,你需要包含一个为模拟器(i386)和一个为设备(例如 armv7)的库文件。

    • 可选地,你可以创建一个包含两个架构的 fat static library



原回答:

你没有链接到正确的 libz 文件。如果你右键单击该文件并在 Finder 中显示其路径,则路径应该位于 iOS sdk 文件夹中的某个位置。例如我的路径为:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

我建议删除该引用,然后将其重新添加到你目标的 Link Binary With Libraries 部分 Build Phases 中。


4
可能是因为你需要在项目设置/其他链接器标志中添加“-licucore”这个词。在我的调试版本中,它是自动添加的,但在发布版本中没有添加,所以无法编译。 - JulianB
4
我遇到了同样的问题。没有认真阅读安装说明,所以没有注意到新版本的bugsense需要在构建阶段添加libz二进制文件。 - Max MacLeod
2
你确定在各自的 .m 文件中为你在头文件中声明的所有类都包含了 @implementation 部分吗? - slcott
7
我认为你引用另一个回答并告诉我们可以给它投赞成票是非常有礼貌的,我只想补充一下。 - Andrew
有没有人可以帮帮我?我遇到了以下错误,但以上所有解决方案都对我无效。我已经花了几天时间尝试所有可能的设置。Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) - red-devil
显示剩余2条评论

197

昨晚我遇到了类似的问题,问题与我在Finder中将一个类拖到Xcode项目有关。

解决方法是前往“Build Phases”选项卡,然后点击“Compile Sources”,确保你将该类拖到了列表中。


6
我希望早些意识到这就是我一直在寻找的答案。或者,当你复制类时,可以确保勾选“添加到目标”。 - T. Markle
1
哇...太高兴了,修复起来这么容易!明确一下,如果你通过从Finder拖动添加一个类到你的项目中,XCode显然并不总是会将它们添加到你的构建阶段列表中。我只需在“编译源代码”下的构建阶段中点击“+”按钮,添加所有有问题的文件,然后就可以直接编译了。 - Amos
2
哇!苹果真的需要重新考虑他们的错误消息。 - devios1
2
另一种解决方法是选择所谓缺失的文件。并打开“实用工具”滑动栏。(最右边的那个)然后选择“文件检查器”。然后确保在“目标成员资格”下项目中有一个勾选。我正在使用Xcode 4.6.2。 - zingle-dingle
1
我不知道哪个文件丢失了,所以我在助手编辑器中显示了“构建阶段”(第二个编辑视图)。我在左侧编辑视图中打开有问题的文件,并检查每个导入的文件是否存在于“构建阶段”中。我添加了缺失的那个文件,问题得到解决。 - Dan Sandland
显示剩余2条评论

38

我曾遇到过类似的问题,我不得不在每个项目配置(Debug、Release和Deployment)以及目标的Build Settings中检查“仅构建活动架构”。


3
对我也起了作用。虽然只是在主项目中需要它。 - Alexis C.
5
我遇到了相同的问题。 Pods 和我的项目之间的 Build Active Architecture Only 设置不同。在链接阶段,它失败了。 - AechoLiu

21

"undefined symbol" 链接错误的另一个可能原因是在 .mm 文件中尝试从 C 函数中调用函数。在这种情况下,您需要在导入头文件时使用 extern "C" {...}。

链接错误:从Objective-C++调用C函数


14

我也遇到了类似的问题。在_OBJC_CLASS_$_后面的类名实际上是我的类名。原因是我拖动源代码文件到导航列表中时没有勾选"添加到目标"。

我的解决方法是:

  1. 从导航列表中删除该类并选择"仅移除引用"

  2. 再次拖动源代码文件,确保"添加到目标"的复选框被勾选。这个复选框位于"复制(如果需要)"和"创建组"的下方。


只是补充一下:尽管这不是错误的最常见原因,但我刚刚发现了你的答案(没有勾选框)。 - Adam

8

通常有一个没有版本标识符的别名与当前版本链接,例如在这种情况下 libz.dylib 链接到 libz.1.2.5.dylib。使用基本别名而不是带版本号的别名。


7

当我使用Admob库时,我遇到了同样的问题。我通过将“Architectures”更改为“标准架构armv7,armv7s”,而不包括64位来解决它。构建设置


5

我碰到类似的问题,看到与 "std::" 相关的错误。

我修改了构建设置 -> Apple LVM 5.0 - Language C++ -> C++ Standard Library

从 libc++(带有 C++11 支持的 LLVM C++ 标准库)更改为 libstdc++(GNU C++ 标准库)。


5

我只是将libz.1.2.5.dylib添加到我的项目中,就像魔法一样它就可以工作了。

步骤 -

  1. 进入Build Phases。
  2. 链接二进制文件库-使用“+”按钮选择要添加的框架和库。
  3. 从列表中选择libz.1.2.5.dylib。
  4. 构建并运行。

5

在目标->构建设置->Apple LLVM编译器语言中: 将“C++语言方言”和“C++标准库”设置为编译器默认值有助于解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接