架构armv7的未定义符号


307

这个问题一直让我发疯,我无法解决该问题。

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


现有答案中未涵盖的另一种可能性是,您可能正在使用-ObjC其他链接器标志,因此您正在使用的外部静态库中的Obj-C是不可见的(例如从Parse的可见)。如果是这种情况,请参阅我的回答:stackoverflow.com/a/26151208/901641
ArtOfWarfare 2014年

2
根据经验,当文件未添加到项目时,XCode会给出诸如Match-O和体系结构i386(或其他)找不到的符号之类的错误。可以右键单击项目文件夹,然后执行“将文件添加到<项目>”。
Fabricio PH 2015年

您实际上可以看到使用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

Answers:


506

常见原因

“体系结构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

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


4
也可能是因为您需要在项目设置/其他链接器标记中添加单词“ -licucore”。它是为我的调试版本自动添加的,但没有为发布版本添加,因此无法编译。
JulianB

4
我遇到过同样的问题。并没有真正正确地阅读安装说明,因此没有注意到新版本的bugsense需要在构建阶段中添加libz二进制文件。
Max MacLeod

2
您确定在头文件中声明的所有类的相应.m文件中都包含@implementation节吗?
slcott 2013年

7
我只想补充一点,我想请您参考这个问题的另一个答案,并告诉我们如果有帮助的话,请多加投票。
安德鲁(Andrew)

感谢帮助!:)对我来说,有助于在“其他链接器标记”部分中明确输入:-framework <FrameWorkName>。我在XCTest上遇到问题,所以我不得不添加-framework XCTest。谢谢!:)
piotr_ch 2014年

198

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

解决方案是先进入“构建阶段”选项卡,然后进入“编译源”,并确保将类拖到列表中。


6
我希望我已经意识到这是我早先寻找的答案-或者,您可以在复制课程时确保选中“添加到目标”。
T. Markle

1
哇...太高兴了,修复如此简单!明确地说,如果通过从查找程序拖动到项目中来添加类,则XCode并不总是将它们显然添加到构建阶段列表中。我只是在构建阶段按“编译源”中的“ +”按钮,添加了所有有问题的文件,并立即对其进行了编译。
阿莫斯(Amos)2012年

1
哇。苹果确实需要重新考虑他们的错误信息。
devios1

2
解决此问题的另一种方法是选择丢失的选择文件。并打开“实用程序”滑出栏。(那是最右边的),然后选择“文件检查器”。然后确保在“目标成员身份”下的项目中进行了检查。我正在使用Xcode 4.6.2
zingle-dingle

1
我不知道缺少哪个文件,因此我在助手编辑器(第二个编辑视图)中显示了“构建阶段”。我在左侧的编辑视图中打开了有问题的文件,并检查了每个导入的文件是否在构建阶段中存在。我添加了一个没有,并解决了。
丹·桑德兰

38

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


3
也帮了我大忙。虽然只是在主要项目中需要。
Kirualex 2012年

4
我遇到同样的问题。该Build Active Architecture Only设置之间是不同的Pods,我的项目。在链接阶段,它失败了。
AechoLiu


14

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

我的解决方案是:

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

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


只是要补充:尽管这不是错误的最常见原因,但现在我只是您的答案(没有在方框中打勾)。
2012年

8

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


5

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


5

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

步骤 -

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

5

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

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

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


5

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


4

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


4

如果您-ObjC在“目标”>“构建设置”>“其他链接器标志”下有该标志,并且遇到此问题,请考虑将其删除。如果您有意添加它是因为您需要从静态库中加载通常不会加载的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

4

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

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

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


3

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

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



3

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

在“项目浏览器”(右侧)中选择类,打开“实用工具”侧栏(右侧),从“实用工具”中选择“文件检查器”(类似图标的文件),在“目标成员”选项卡下,勾选目标。所有这些都是为了避免“删除引用”,并通过勾选“添加到目标”技巧再次添加。

因此:选择类 -> 实用程序(文件检查器) -> 目标成员资格 -> 勾选所需的目标。


2

我在这里没有找到这个建议,因为如果您的项目有多个目标(例如,一个OSX和一个iOS),那么您必须为每个目标链接相关的库。需要AudioToolbox ..我必须为OSX和iOS分别添加一次(在frameworks文件夹下,对于每个目标,每个库都必须有一个副本。.如果只看到一个..那是一个危险信号)


这个答案帮助了我。但是,我的情况更加直截了当……我只是忘了添加我的代码库引用的框架。就我而言,我无法加载AVFoundation.framework。
约翰·埃克

是的,我只是忘了在“链接二进制文件和库”阶段下添加框架。
最多

2

我遇到了PJSIP库的问题,

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

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


我在PJSIP librabries上遇到了同样的问题,您能详细解释一下解决方案吗?
Rajat Jain

在项目构建设置的其他链接器标志中设置以下值:-framework Foundation -framework UIKit
Adeesh Jain

错误消息:忽略文件/Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a,该文件是为存档而非链接的体系结构(i386)构建的:/ Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a体系结构i386的未定义符号:“ _ pjsip_register_method”,引用自:
Rajat Jain

似乎您正在尝试在模拟器上运行应用程序,而libyuv.a不是针对模拟器体系结构i386构建的。尝试直接在设备上运行应用程序
Adeesh Jain

我想将Pjsip集成到Swift中。我尝试创建桥接头,但没有成功。你能给我个主意吗?
Rajat Jain

1

终于我弄清楚了,我通过在目标->构建阶段->用库链接二进制文件中添加缺少的框架解决了这个问题


1

我曾经有这个问题。我意识到在上课时,我已经.mm.h目标文件夹中。

解决该问题后,该错误已修复。


1

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

将子项目的“ C ++标准库”设置更改为libc ++可以修复该问题,但前提是必须先将该子项目的部署目标设置为5.0或更高版本(libc ++则需要5.0)。


1

我为您提供了更多建议,您可以在其他常见建议无法解决时进行检查。

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

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

1

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


1

我有同样的问题。我尝试了很多答案,但最终我的问题是:我正在使用openCV,因此我需要在代码中结合C ++代码。为此,您应该将使用Objective-C和C ++的文件更改为.mm,但我没有更改一个文件,并且该文件与C ++代码没有任何关系,但是我必须对其进行更改。


1

安装shareKit时遇到了这个问题。它可以在模拟器中运行,但不能在设备上运行。我从“ 其他链接器”标志中删除了-all_load,并且在模拟器和iPhone设备上一切正常。


1

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

XCode .m与.mm

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

这为我解决了。




1

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


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.