架构armv7的未定义符号

Ale*_*ott 304 armv7 ios

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

    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
Run Code Online (Sandbox Code Playgroud)

我认为这与:

ld: symbol(s) not found for architecture armv7
Run Code Online (Sandbox Code Playgroud)

但我补充道:libz.1.2.3.dylib它没有帮助,任何人都有任何想法?

Joe*_*Joe 502

常见原因

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

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

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

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

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

  • 我只是想补充一下,我认为你真的很尊重你提到这个问题的另一个答案,如果有帮助的话,请告诉我们投票. (7认同)
  • 也可能是因为您需要在项目设置/其他链接标志中添加"-licucore"一词.它是为我的调试版本自动添加的,但不是发布版本,因此无法编译. (4认同)
  • 我遇到过同样的问题.没有真正正确阅读安装说明,所以没有注意到新版本的bugsense需要在构建阶段添加libz二进制文件. (4认同)
  • 您是否确定已在相应的.m文件中为头文件中声明的所有类添加了@implementation部分? (2认同)

Cor*_*tex 197

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

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

  • 我希望我已经意识到这是我之前寻找的答案 - 或者你可以确保在复制课时检查'添加到目标'. (6认同)
  • 哇。苹果*真的*需要重新考虑他们的错误消息。 (2认同)
  • 解决此问题的另一种方法是选择文件,据说缺少.并打开"Utilities"滑出栏.(这是最右边的那个)并选择"文件检查器".然后确保在"目标会员"下检查项目.我正在使用Xcode 4.6.2 (2认同)

Ale*_*one 37

我遇到了类似的问题,我必须在每个项目配置(调试,发布和部署)以及目标的构建设置中检查"仅构建活动体系结构".

  • 我遇到了同样的问题.`Pods`和我的项目之间的`Build Active Architecture Only`设置是不同的.在链接阶段,它失败了. (4认同)
  • 也为我做了诀窍.虽然只是在主要项目中需要. (3认同)

小智 21

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

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


小智 14

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

我的解决方案是:

  1. 从导航列表中删除该类,然后选择"仅删除引用"

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


zap*_*aph 8

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


小智 5

在目标 - >构建设置 - > Apple LLVM编译器语言下:将"C++语言方言"和"C++标准库"设置为编译器默认帮助解决它.


gir*_*_vr 5

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

步骤 -

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


小智 5

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

我更改了Build Settings - > Apple LVM 5.0 - Language C++ - > C++ Standard Library

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


小智 5

使用admob库时,我遇到了同样的问题,我修复了该问题,将“架构”更改为“标准体系结构armv7,armv7s”,而没有包括64位。 构建设置


Art*_*are 5

如果您-ObjC的“目标”>“构建设置”>“其他链接器标志”下有该标志并且遇到此问题,请考虑将其删除。如果您故意添加它是因为您需要从静态库加载一些通常不会加载的 Obj-C 代码,否则 IE(一个 Obj-C 类别),那么您应该-force_load <path>使用-ObjC.

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

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj
Run Code Online (Sandbox Code Playgroud)

那么你应该设置这个标志Other Linker Flags

-force_load iOSAPI.framework/iOSAPI
Run Code Online (Sandbox Code Playgroud)

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

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
Run Code Online (Sandbox Code Playgroud)