架构armv7的未定义符号

时间:2011-06-21 17:33:18

标签: ios armv7

这个问题一直让我发疯,我无法解决如何修复它......

    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并且它没有帮助,任何人都有任何想法?

40 个答案:

答案 0 :(得分:492)

常见原因

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

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

    • Link Binary With Libraries Build Phases 部分添加正确的库。

    • 如果您要在默认搜索路径之外添加库,可以在构建设置中的 Library Search Paths 值中包含路径并将<{1}}(例如,对于libz.a使用-l{library_name_without_lib_and_suffix})添加到 -lz 部分> Other Linker Flags 点。

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

    • 打开 Build Settings 以获取正确的目标,展开 Build Phases ,添加缺少的Compile Sources个文件。如果这是您的问题,请同时选择Cortex's answer below

  3. 包含为其他架构构建的静态库,例如主机上的模拟器i386。要解决:

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

      < / LI>
    • 您可以选择创建包含两种架构的fat static library



  4. 原始答案:

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

      

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

    我建议删除引用,然后将其重新添加回“目标链接二进制文件”部分“构建阶段”。

答案 1 :(得分:197)

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

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

答案 2 :(得分:37)

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

答案 3 :(得分:20)

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

Linker error calling C-Function from Objective-C++

答案 4 :(得分:14)

我遇到了类似的问题。 _OBJC_CLASS _ $ _之后的类名实际上是我的类。原因是当我将源代码文件拖到导航列表中时,我没有勾选“添加到目标”。

我的解决方案是:

  1. 从导航列表中删除该类,然后选择“仅删除参考”

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

答案 5 :(得分:8)

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

答案 6 :(得分:5)

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

答案 7 :(得分:5)

我有类似的问题,并看到与“std ::”

相关的错误

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

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

答案 8 :(得分:4)

以下是我遇到此问题的方法:

我通过将它们拖到我的项目导航器中,从另一个项目中添加了一个.h,.m和NIB。 Xcode没有正确地将它们添加到Build Phases中。

检查my answer,因为我遇到了类似的问题,我可以通过一些步骤来解决这个问题。

答案 9 :(得分:4)

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

步骤 -

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

答案 10 :(得分:4)

我在.h文件中有多个@interfaces,但还没有包含所有相应的@implementation指令。确保它们都是平衡的。

答案 11 :(得分:3)

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

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

答案 12 :(得分:3)

如果您的目标&gt;下有标记-ObjC构建设置&gt;其他链接器标志,你得到这个问题,考虑删除它。如果你故意添加它是因为你需要从一个通常不会加载的静态库中加载一些Obj-C代码,IE,一个Obj-C类,那么你应该使用-force_load <path>而不是{{1 }}

-ObjC应该与您的Xcode项目目录相关。 IE,如果您的目录结构如下所示:

<path>

然后你应该为iOSProject + iOSAPI.framework + iOSAPI + iOSAPI.xcodeproj 设置这个标志:

Other Linker Flags

如果您想要包含多个类似的库,那么您应该为每个库添加一个单独的-force_load iOSAPI.framework/iOSAPI 行。

-force_load

答案 13 :(得分:3)

当我使用admob库时遇到了同样的问题,我修改了它将“架构”更改为“标准架构armv7,armv7s”而不包括64位。 Build Settings

答案 14 :(得分:3)

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

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

所以:选择课程 - &gt; 实用程序(文件检查器) - &gt; 目标会员 - &gt; 勾选您想要的目标。

答案 15 :(得分:3)

转到您的项目,点击Build phases,Compile sources,Add GameCenterManager.m到列表。

答案 16 :(得分:2)

我遇到了PJSIP库的问题,

在项目中的其他链接器标志中尝试以下内容并能够解决错误: -framework 基础 -framework UIKit的

上面的链接器标志用于Siphone Project over github。这些设置将帮助您解决与链接C ++库相关的问题。

答案 17 :(得分:2)

我没有在这里找到这个建议,所以这里是: 如果您的项目有多个目标(即一个用于OSX,一个用于iOS),那么您必须链接每个目标的相关库 ..所以例如在我的情况下我需要AudioToolbox ..我有为OSX添加一次,为iOS添加一次(在 frameworks 文件夹下,每个目标必须有每个库的副本..如果只看到一个..那就是红旗)< / p>

答案 18 :(得分:1)

我在安装shareKit时遇到了这个问题。它在模拟器中工作,但不在设备上。我从其他链接器标记中删除了-all_load,在模拟器和iphone设备中一切正常。

答案 19 :(得分:1)

对于它的价值,我去了target-&gt; Build Phases-&gt; Link Binary With Libraries后删除了libstdc ++。tbd引用,然后添加了对libstdc ++。6.0.9.tbd的引用。

答案 20 :(得分:1)

如果您使用Unity3D 5并使用Prime31插件进行构建,并且您收到此错误,则可能是因为重复的.dll。如果您在Unity编辑器中查看警告,其中一个会告诉您并警告它可能会导致构建错误。要查看是否是这种情况,请在项目搜索字段中键入P31,它应该向上弹出,甚至可以弹出多个。副本将有一个&#39; 1&#39;在文件名的末尾。这可能是因为通过商店或Prime31菜单选项卡更新了编辑器中的插件。

答案 21 :(得分:1)

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

答案 22 :(得分:1)

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

file const kFooKey = @"Foo";

答案 23 :(得分:1)

当模块(文件.m)不在我正在使用的目标中时,我用来面对这个问题。

答案 24 :(得分:1)

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

XCode .m vs. .mm

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

为我修好了。

答案 25 :(得分:1)

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

修复该问题修复了错误。

答案 26 :(得分:1)

我遇到了同样的问题。我从巨大的答案列表中尝试了所有的东西,但最后我的问题是: 我正在使用openCV,所以我需要在我的代码中结合C ++代码。为此,您应该将使用objective-c和C ++的文件更改为.mm 我没有更改一个文件,这个文件没有与C ++代码的连接,但我不得不改变它。

答案 27 :(得分:1)

我在 iphone5s 上运行应用时出现此问题,通过将 arm64 添加到体系结构来解决此问题。

答案 28 :(得分:1)

最后我已经弄明白了,我通过添加缺席框架到目标来解决这个问题 - &gt;构建阶段 - &gt;链接二进制文件库

答案 29 :(得分:1)

我向您提供了更多建议,您可以查看其他常见建议何时无效。

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

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

答案 30 :(得分:1)

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

将子项目的“C ++标准库”设置更改为libc ++修复它,但只有在首次将子项目的部署目标设置为5.0或更高版本(libc ++需要5.0)之后才能修复它。

答案 31 :(得分:1)

这解决了我的问题:我正在使用的依赖项不支持armv7。因此,除了删除它,我别无选择。反正Armv7只能用于非常老的iPhone(如iPhone 4)。

  • 转到“构建设置/全部”
  • 将“有效架构”设置为“ arm64 arm64e”

答案 32 :(得分:0)

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

答案 33 :(得分:0)

如果在发布模式下构建Flutter项目时遇到此问题,那对我有帮助:

  1. 在文件>项目设置…
  2. 中将构建系统设置为新构建系统
  3. 从项目文件夹中删除文件夹iosbuild_ios
  4. 通过从您的项目文件夹中执行ios
  5. 创建flutter create .模块。
  6. 打开Xcode,然后:

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

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

现在打开您的Xcode并对其进行构建或归档:产品>构建(或归档)

答案 34 :(得分:0)

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

框架或库没有ARMV7架构。

答案 35 :(得分:0)

我在另一个类的.h文件中编写了两个类时遇到了这个警告,但FORGOT在.m文件中编写了这个类的实现。

答案 36 :(得分:0)

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

我只需转到Product>Clean

即可解决此问题

答案 37 :(得分:0)

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

答案 38 :(得分:0)

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

答案 39 :(得分:0)

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

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