未定义的符号为build筑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
并没有帮助,任何人有任何想法?
常见原因
“架构armv7未定义符号”的常见原因是:
-
您导入一个标题,不要链接到正确的库 。 这是很常见的,特别是像QuartzCore这样的库的头文件,因为它默认不包含在项目中。 解决:
-
在“
Build Phases
的“Link Binary With Libraries
部分添加正确的库。 -
如果要在默认searchpath外添加库,可以在“生成设置”中的
Library Search Paths
值中包含path,然后添加
-l{library_name_without_lib_and_suffix}
(例如,对于libz.a,使用-lz
)到Build Settings
的Other Linker Flags
部分。
-
-
您将文件复制到您的项目,但忘记检查目标添加文件 。 解决:
- 打开正确的目标的
Build Phases
,展开Compile Sources
并添加缺less的.m
文件。 如果这是您的问题,请同时提供Cortex的答案 。
- 打开正确的目标的
-
你包含一个静态库,为其他架构如i386(主机上的仿真器)构build 。 解决:
-
如果您的库供应商有多个库文件以包含在项目中,则需要包含模拟器(i386)和设备(例如armv7)的库文件。
-
或者,您可以创build一个包含两种体系结构的胖静态库 。
-
原始答案:
你没有链接到正确的libz文件。 如果您右键单击该文件并在finder中显示其path应该在iOS sdk文件夹中的某处。 这是我的例子
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib
我build议删除引用,然后将其重新添加回“链接二进制库”部分构build目标的阶段。
我昨天有一个类似的问题,这个问题与我从Finder拖拽一个类到Xcode中的项目有关。
解决方法是进入“构build阶段”选项卡,然后select“编译源”,并确保将类拖到列表中。
我有类似的问题,我不得不在每个项目configuration(debugging,发布和部署)和目标的生成设置中检查“仅生成主动架构”。
“未定义符号”链接器错误的另一个可能的原因是尝试从.mm文件调用C函数。 在这种情况下,当您导入头文件时,您将需要使用extern“C”{…}。
从Objective-C ++调用C函数的链接器错误
我也有类似的问题。 _OBJC_CLASS _ $ _之后的类名实际上是我的类。 原因是当我将源代码文件拖到导航列表中时,我没有勾选“添加到目标”。
我的解决scheme是:
-
从导航列表中删除类并select“仅删除参考”
-
再次拖动源代码文件并确保勾选了“添加到目标”的勾选框。 checkbox就在“如果需要复制”和“创build组”之下。
通常有一个没有链接到当前版本的版本标识符的别名,在这种情况下,libz.dylib链接到libz.1.2.5.dylib。 使用基本别名而不是版本化的。
在Target – > Build Settings – > Apple LLVM编译器语言下:将'C ++ Language Dialect'和'C ++ Standard Library'设置为Compiler default帮助解决它。
我只将libz.1.2.5.dylib添加到我的项目中,它像一个魅力。
步骤 –
- 去build立阶段。
- 链接二进制文件库 – 使用“+”buttonselect要添加的框架和库。
- 从列表中selectlibz.1.2.5.dylib。
- build立并运行。
以下是我如何得到这个问题:
我通过将其拖放到项目导航器上,从另一个项目中添加了.h,.m和NIB。 Xcode没有正确地将它们添加到Build Phases中。
检查我的答案,因为我有一个类似的问题,我可以通过一些步骤来解决。
我在.h文件中有多个@interface,还没有包含所有相应的@implementation指令。 确保他们都是平衡的。
我有一个类似的问题,看到有关“std ::”
我更改了Build Settings – > Apple LVM 5.0 – Language C ++ – > C ++ Standard Library
从libc ++(支持C ++ 11的LLVM C ++标准库)到libstdc ++(GNU C ++标准库)
如果你正在处理iOS5升级,我发现编译一个写入目标4.3的项目,我可以将Project Navigator中的libz.1.2.3.dynlib重命名为libz.1.2.5.dynlib并编译。
我的iPhoneOS50SDK / usr / lib文件夹没有libz.1.2.3.dynlib – 不知道这是一个testing版本还是自然升级。
转到您的项目,单击生成阶段,编译源代码,将GameCenterManager.m添加到列表中。
如果您在目标>构build设置>其他链接器标志下有标志-ObjC
,并且出现此问题,请考虑删除它。 如果你故意添加它,因为你需要从静态库中加载一些Obj-C代码,否则通常不会加载IE,一个Obj-C类,那么你应该使用-force_load <path>
而不是-force_load <path>
。
<path>
应该是相对于你的Xcode项目目录。 IE,如果你的目录结构如下所示:
iOSProject + iOSAPI.framework + iOSAPI + iOSAPI.xcodeproj
那么你应该为Other Linker Flags
设置这个Other Linker Flags
:
-force_load iOSAPI.framework/iOSAPI
如果你想包含这样的多个库,那么你应该为每个库包含一个单独的-force_load
行。
-force_load iOSAPI.framework/iOSAPI -force_load another.framework/another
我没有在这里find这个build议,所以在这里:如果你的项目有多个目标(即一个用于OSX,一个用于iOS),那么你必须链接每个目标的相关库..例如在我的情况下,我需要AudioToolbox ..我必须添加一次的OSX和一次的iOS(在frameworks文件夹,你必须有每个目标的每个库的副本..如果你看到只有一个..那么这是一个红旗)
最后,我明白了,我通过添加缺席的框架来解决这个问题 – >构build阶段 – >与库链接二进制
当我使用admob库时,我遇到了同样的问题,我修改了“Architectures”到“Standard architecture armv7,armv7s”(不包括64位)。
我在安装shareKit时遇到了这个问题。 它在模拟器中工作,但不在设备上。 我从其他链接标志中删除了-all_load,并且在模拟器和iphone设备中一切正常。
当模块(文件.m)不在我正在使用的目标中时,我使用该问题来解决这个问题。
对我来说,问题是我忘记在.m (实现)中为我的常量设置值,
file const kFooKey = @"Foo";
我也通过拖放添加文件。 我做了什么,我删除了所有文件(排除frameworks
)的引用,然后通过添加文件到项目选项再次正确地添加它们,问题没有了。
我正在面对PJSIP库的一个问题,
在项目中的其他链接器标志尝试以下,并能够解决错误:-framework基础框架UIKit
以上连接器标志在Github的Siphone项目中使用。 这些设置将帮助您解决与链接C ++库有关的问题。
你的目标可能缺less一些类别。 这通常发生在您重命名/删除/添加新的类文件到您的项目。 要修复将新添加的类添加到某些目标。
selectProject Navigator中的类(右侧边栏),打开Utilities边栏(右侧边栏),从Utilities中selectFile Inspector(文件如图标),在Target Membership选项卡下勾选您的目标。 这是为了避免“删除参考”,并添加勾选“添加到目标”的伎俩。
所以: select类 – > 实用工具(文件督察) – > 目标成员 – > 勾选你想要的目标。
我曾经有过这个问题。 我意识到,在移动课程时,我已经用目标文件夹上的.h
文件覆盖了.mm
文件。
解决这个问题解决了错误。
当我包含一个第三方框架时,我面临同样的问题。
当我从目标的“生成设置”中的“有效体系结构”条目中删除armv7时,问题得到解决,它开始工作。
尝试编译“C ++标准库”设置为“libc ++”的目标构build设置的项目时,收到“架构armv7的未定义符号:”错误(因为项目正在使用C ++ 11的某些function,所以必需)该项目包括一个具有相同的设置为'libstdc ++'(或编译器默认为当前)的子项目。
只有在首先将子项目的部署目标设置为5.0或更高(对于libc ++来说,5.0是必需的)之后,将子项目的“C ++标准库”设置更改为libc ++才解决了这个问题。
我给你更多的build议,你可以检查其他常见的build议没有帮助。
如果你链接到其他项目(libxxx.a),你可能会遇到一个奇怪的问题,你可以用nm这样的工具find这个符号,但是他们找不到ld中的符号。 那么你应该检查两个项目是否在同一个标志中,其中一些可能会影响二进制格式。
- 检查c ++编译器。
- 检查c ++方言设置。
- 检查c ++运行时types的支持。 (-frtti / -fnortti)
- 检查是否有与其他地方出现的同名的.a,可能超出了链接path列表中想要的文件。 删除它们。
重命名你的m文件(其中包括方法funcs)到mm,反之亦然将解决你的问题。 我解决了重命名mm到m或者m到mm。
当我在iphone5上运行应用程序时遇到了这个问题,它通过将ARM64添加到架构来解决。
我有同样的问题。 我尝试了一大堆答案,但最终我的问题是:我正在使用openCV,所以我需要在我的代码中结合使用C ++代码。 要做到这一点,你应该改变使用Objective-C和C ++文件.mm我没有改变一个文件,这个文件没有连接到C ++代码,但我不得不改变它。