315

这个问题一直让我发疯,我不知道如何解决它......

    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这没有帮助,有人有什么想法吗?

4

40 回答 40

512

常见原因

“架构 armv7 的未定义符号”的常见原因是:

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

    • .Link Binary With Libraries _Build Phases

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

  2. 将文件复制到项目中,但忘记检查目标以将文件添加到. 解决:

    • 打开Build Phases正确的目标,展开Compile Sources并添加丢失的.m文件。如果这是您的问题,请也支持Cortex 在下面的回答

  3. 包括一个为另一个架构(如 i386)构建的静态库,即主机上的模拟器。解决:

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

    • 或者,您可以创建一个包含两种架构的胖静态库。



原答案:

您没有链接到正确的 libz 文件。如果您右键单击该文件并在 finder 中显示它的路径应该在 iOS sdk 文件夹中的某个位置。这是我的例子

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

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

于 2011-06-21T17:38:30.990 回答
198

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

解决方案是转到 Build Phases 选项卡,然后是 Compile Sources 并确保将类拖到列表中。

于 2012-04-16T07:39:49.053 回答
37

我遇到了类似的问题,我必须在每个项目配置(调试、发布和部署)和目标的构建设置中检查“仅构建活动架构”。

于 2011-12-19T23:52:54.787 回答
21

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

从 Objective-C++ 调用 C-Function 的链接器错误

于 2013-03-13T18:33:59.337 回答
14

我也有类似的问题。_OBJC_CLASS_$_ 之后的班级名称实际上是我的班级。原因是我在将源代码文件拖入导航列表时没有勾选“添加到目标”。

我的解决方案是:

  1. 从导航列表中删除类并选择“仅删除参考”

  2. 再次拖动源代码文件并确保选中“添加到目标”复选框。复选框位于“如果需要则复制”和“创建组”下方。

于 2012-05-09T00:32:28.917 回答
8

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

于 2011-09-25T12:16:12.893 回答
6

我在使用 admob 库时遇到了同样的问题,我修复了它,将“架构”更改为“标准架构 armv7,armv7s”,不包括 64 位。构建设置

于 2013-11-29T10:09:56.057 回答
5

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

于 2012-11-06T22:22:00.407 回答
5

我只将 libz.1.2.5.dylib 添加到我的项目中,它就像一个魅力。

步骤-

  1. 转到构建阶段。
  2. 将二进制文件与库链接 - 使用“+”按钮选择要添加的框架和库。
  3. 从列表中选择 libz.1.2.5.dylib。
  4. 构建并运行。
于 2013-08-22T09:03:53.457 回答
5

我有一个类似的问题,并看到与“std::”相关的错误

我更改了构建设置 -> Apple LVM 5.0 - 语言 C++ -> C++ 标准库

从 libc++(支持 C++11 的 LLVM C++ 标准库)到 libstdc++(GNU C++ 标准库)

于 2013-11-15T20:14:59.603 回答
5

如果您-ObjC的 Target > Build Settings > Other Linker Flags 下有该标志并且遇到此问题,请考虑将其删除。如果您故意添加它是因为您需要从静态库中加载一些通常不会加载的 Obj-C 代码,IE,一个 Obj-C 类别,那么您应该使用-force_load <path>而不是-ObjC.

<path>应该相对于您的 Xcode 项目目录。IE,如果您的目录结构如下所示:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

然后你应该设置这个标志Other Linker Flags

-force_load iOSAPI.framework/iOSAPI

如果您想包含多个这样的库,那么您应该-force_load为每个库包含一个单独的行。

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
于 2014-10-01T21:45:09.497 回答
4

这是我遇到这个问题的方法:

我从另一个项目中添加了一个 .h、.m 和 NIB,方法是将它们拖到我的项目导航器上。Xcode 没有正确地将它们添加到构建阶段。

检查我的答案,因为我有一个类似的问题,我可以通过执行一些步骤来解决。

于 2012-05-02T14:42:31.567 回答
4

我在 .h 文件中有多个 @interfaces 并且尚未包含所有相应的 @implementation 指令。确保它们都是平衡的。

于 2013-04-17T22:27:52.860 回答
3

如果您正在处理 iOS5 升级,我发现要编译一个写入目标 4.3 的项目,我可以将项目导航器中的 libz.1.2.3.dynlib 重命名为 libz.1.2.5.dynlib 并编译。

我的 iPhoneOS50SDK/usr/lib 文件夹中没有 libz.1.2.3.dynlib——不知道是测试版还是自然升级。

于 2011-09-18T19:16:11.150 回答
3

转到您的项目,单击构建阶段,编译源,将 GameCenterManager.m 添加到列表中。

于 2012-10-13T19:01:44.533 回答
3

您的目标可能缺少某些类。当您将新的类文件重命名/删除/添加到项目中时,通常会发生这种情况。修复将新添加的类添加到某些目标。

在 Project Navigator 中选择类(右侧栏),打开 Utilities 侧栏(右侧栏),从 Utilities 中选择 File Inspector(类似文件的图标),在 Target Membership 选项卡下勾选您的目标。这一切都是为了避免“删除参考”并通过勾选“添加到目标”技巧再次添加。

所以:选择类->实用程序(文件检查器) ->目标成员->勾选你想要的目标。

于 2012-11-29T12:35:08.033 回答
3

这解决了我的问题:我使用的依赖项不支持 armv7。所以我别无选择,只能删除它。无论如何,Armv7 仅用于非常旧的 iphone(如 iphone 4)。

  • 转到“构建设置/全部”
  • 将“有效架构”设置为“arm64 arm64e”
于 2020-05-25T14:43:04.323 回答
2

我在这里没有找到这个建议,所以这里是这样:如果您的项目有多个目标(即一个用于 OSX,一个用于 iOS),那么您必须为每个目标链接相关库.. 例如在我的情况下,我需要AudioToolbox ..我必须为OSX添加一次,为iOS添加一次(在frameworks文件夹下,您必须为每个目标复制每个库..如果您只看到一个..那么这是一个危险信号)

于 2012-11-04T07:55:23.947 回答
2

我遇到了 PJSIP 库的问题,

在项目中的其他链接器标志中尝试了以下操作并能够解决错误:-framework Foundation -framework UIKit

上面的链接器标志在 github 上的 Siphone 项目中使用。这些设置将帮助您解决与 C++ 库链接相关的问题。

于 2013-05-30T13:10:37.107 回答
1

最后我想通了,我通过向 target->Build Phases->Link Binary With Libraries 添加不存在的框架解决了这个问题

于 2013-02-21T14:23:13.003 回答
1

我曾经遇到过这个问题。我意识到在移动课程时,我已经用目标文件夹上的文件覆盖了.mm文件。.h

修复该问题修复了错误。

于 2013-03-11T22:15:51.153 回答
1

我在尝试编译将“C++ 标准库”的目标构建设置设置为“libc++”的项目时收到“架构 armv7 的未定义符号:”错误(这是必要的,因为该项目使用了 C++ 11 中的某些功能),并且该项目包括一个子项目,该子项目具有相同的设置设置为“libstdc++”(或当前的编译器默认值)。

将子项目的“C++ 标准库”设置更改为 libc++ 修复了它,但前提是首先将子项目的部署目标设置为 5.0 或更高版本(libc++ 需要 5.0)。

于 2013-06-07T23:21:37.763 回答
1

我给你更多的建议,当其他常见的建议没有帮助时,你可以检查一下。

如果您与其他项目(libxxx.a)链接,您有时可能会遇到奇怪的问题,您可以使用 nm 之类的工具找到符号,但他们无法在 ld 中找到符号。然后您应该检查两个项目是否构建在相同的标志中,其中一些可能会影响二进制格式。

  1. 检查 c++ 编译器。
  2. 检查 C++ 方言设置。
  3. 检查 C++ 运行时类型支持。(-frtti/-fnortti)
  4. 检查是否有同名的 .a 出现在其他地方,可能超出链接路径列表中的所需文件。删除它们。
于 2013-06-13T06:16:52.570 回答
1

我在iphone5s上运行应用程序时遇到了这个问题,通过将arm64添加到Architectures解决了这个问题。

于 2013-11-27T11:39:51.920 回答
1

我有同样的问题。我从大量答案列表中尝试了所有事情,但最后我的问题是:我正在使用 openCV,所以我需要在我的代码中结合 C++ 代码。为此,您应该将使用 Objective-c 和 C++ 的文件更改为 .mm 我没有更改一个文件,该文件与 C++ 代码没有任何联系,但我必须更改它。

于 2014-01-24T00:09:04.867 回答
1

我在安装 shareKit 时遇到了这个问题。它在模拟器中有效,但在设备上无效。我从Other Linker Flag中删除了 -all_load ,并且在模拟器和 iPhone 设备中一切正常。

于 2014-02-08T15:44:10.820 回答
1

就我而言,我添加了一个必须使用 Objective C++ 的框架。我找到了这篇文章:

XCode .m 与 .mm

这解释了如何将 main.m 重命名为 main.mm,以便也可以编译 Objective-C++ 类。

那为我修好了。

于 2014-11-11T19:16:14.710 回答
1

当模块(文件 .m)不在我正在使用的目标中时,我常常会遇到这个问题。

于 2015-02-11T07:51:25.607 回答
1

对我来说,问题是我忘记.m(实现)中为我的常量设置值

file const kFooKey = @"Foo";
于 2015-03-02T13:46:12.960 回答
1

我还通过拖放添加了文件。我所做的,我删除了所有文件的引用(不包括),然后通过Add Files To Project选项frameworks再次正确添加它们,问题消失了。

于 2015-03-27T11:29:25.860 回答
1

如果您是从 Unity3D 5 构建并且还使用 Prime31 插件并且您收到此错误,则可能是由于重复的 .dll 造成的。如果您在 Unity 的编辑器中查看警告,其中一个会告诉您这一点并警告它可能导致构建错误。要查看是否是这种情况,请在您的项目搜索字段中键入 P31,它应该会立即弹出,甚至可能不止一个。副本的文件名末尾将有一个“1”。这可能是通过商店或 Prime31 菜单选项卡更新编辑器中的插件引起的。

于 2015-05-28T05:25:05.343 回答
1

值得一提的是,在我转到 target->Build Phases->Link Binary With Libraries,删除了 libstdc++.tbd 引用,然后添加了对 libstdc++.6.0.9.tbd 的引用后,我的修复了。

于 2016-10-15T07:03:50.570 回答
0

当我包含一个第三方框架时,我遇到了同样的问题。

当我从目标的 Build Settings 中的 Valid Architectures 条目中删除 armv7s 时,问题得到解决,它开始工作。

于 2013-05-21T12:48:20.037 回答
0

将您的 m 文件(包括方法 funcs)重命名为 mm 或反之亦然将解决您的问题。我的解决了将 mm 重命名为 m 或将 m 重命名为 mm 的问题。

于 2013-08-02T14:47:59.393 回答
0

尝试至少实现派生类的一个非内联函数。如果您不这样做,链接器可能会避免为该类创建类型信息。

于 2014-10-05T14:50:33.820 回答
0

在 Xcode 版本 6.3.2 中,我通过在 Link Binary With Libraries中添加库libxml2.dyliblibz.dylib解决了完全相同的问题 !

于 2015-06-25T16:01:18.637 回答
0

就我而言,当我在源代码控制下创建一个新分支时,我遇到了类似的问题。

我能够通过简单地解决这个问题Product>Clean

于 2015-10-31T05:45:50.453 回答
0

当我在另一个类的 .h 文件中编写两个类时,我收到了这个警告,但忘记在 .m 文件中编写这些类的实现。

于 2016-10-24T11:29:43.233 回答
0

转到目标 -> 常规 -> 部署信息 -> 设置目标 8.1 或 10.0

框架或库没有 ARMV7 架构。

于 2020-01-29T07:12:56.787 回答
0

如果您在发布模式下构建时遇到了 Flutter 项目的这个问题 - 这对我有帮助:

  1. 在 File > Project Settings... 中将您的构建系统设置为New Build System
  2. 删除文件夹iosbuild_ios从您的项目文件夹中删除。
  3. 通过从项目文件夹ios执行创建模块。flutter create .
  4. 打开 Xcode 并:

    • 在 PROJECT > Runner 中将 IOS 部署目标设置为至少 9.0
    • 检查您的签名和能力
    • 确保您的构建配置在编辑方案中设置为发布...并为通用 iOS 设备构建
  5. pod install从您的项目文件夹执行

  6. flutter pub get从您的项目文件夹执行

现在打开您的 Xcode 并构建或存档它:产品 > 构建(或存档)

于 2020-04-26T19:33:23.967 回答