架构 armv7 的未定义符号
Posted
技术标签:
【中文标题】架构 armv7 的未定义符号【英文标题】:Undefined symbols for architecture armv7 【发布时间】:2011-06-21 17:33:18 【问题描述】:这个问题一直让我发疯,我不知道如何解决它......
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 的),是可见的。如果是这种情况,请查看我的答案:***.com/a/26151208/901641
根据经验,当文件未添加到项目中时,somethimes XCode 会给出诸如 Match-O 和未找到架构 i386(或其他)的符号之类的错误。你可以右键单击项目文件夹并执行“将文件添加到 nm -g
,你应该看看它们是否匹配,这可以为错误提供线索. nm -g file.o 您可以检查使用以下代码解构的 C++ 符号:nm -gC file.o
这里有人可以帮帮我吗?我收到以下错误,但上述解决方案都不适合我。我已经用所有可能的设置度过了几天。 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)
【参考方案1】:
常见原因
“Undefined symbols for architecture armv7”的常见原因是:
您导入了一个标头,但没有链接到正确的库。这很常见,特别是对于像 QuartzCore 这样的库的头文件,因为它默认不包含在项目中。解决方法:
在 Build Phases
的 Link Binary With Libraries
部分添加正确的库。
如果您想在默认搜索路径之外添加一个库,您可以在 Build Settings 中的 Library Search Paths
值中包含该路径并添加-llibrary_name_without_lib_and_suffix
(例如,对于 libz.a 使用 -lz
)到 Build Settings
的 Other Linker Flags
部分em>。
您将文件复制到项目中,但忘记检查目标以将文件添加到。解决方法:
为正确的目标打开Build Phases
,展开 Compile Sources
并添加缺少的 @ 987654332@ 文件。如果这是您的问题,请同时支持Cortex's answer below。
您包含一个为其他架构构建的静态库,例如 i386,即您主机上的模拟器。解决方法:
如果您有多个库供应商提供的库文件要包含在项目中,您需要包含一个用于模拟器 (i386) 和一个用于设备(例如 armv7)。
或者,您可以创建一个包含两种架构的fat static library。
原答案:
您没有链接到正确的 libz 文件。如果您右键单击该文件并在 finder 中显示它的路径应该在 ios sdk 文件夹中的某个位置。这是我的例子
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib
我建议删除引用,然后将其重新添加到目标的 Link Binary With Libraries 部分 Build Phases。
【讨论】:
也可能是因为需要在项目设置/Other Linker Flags中添加“-licucore”字样。它是为我的调试版本自动添加的,但不是发布版本,因此无法编译。 我遇到了同样的问题。没有真正正确阅读安装说明,因此没有注意到新版本的 bugsense 需要在构建阶段添加 libz 二进制文件。 您确定在您的头文件中声明的所有类的相应 .m 文件中都包含了 @implementation 部分吗? 我只是想补充一下,我认为您非常尊重您引用此问题的另一个答案并告诉我们如果有帮助就投票。 感谢您的帮助! :) 对我来说,帮助在其他链接器标志部分明确输入:-framework <FrameWorkName>
。我对 XCTest 有疑问,所以我不得不添加 -framework XCTest
。谢谢! :)【参考方案2】:
昨晚我遇到了类似的问题,这个问题与我将一个类从 Finder 拖到我在 Xcode 中的项目这一事实有关。
解决方案是转到 Build Phases 选项卡,然后是 Compile Sources 并确保将类拖到列表中。
【讨论】:
我希望我已经意识到这是我之前一直在寻找的答案 - 或者,您可以确保在复制课程时选中“添加到目标”。 哇...很高兴修复如此简单!需要明确的是,如果您通过从 finder 拖动到项目中来添加一个类,XCode 显然并不总是将它们添加到您的构建阶段列表中。我只是在构建阶段下的“编译源”中点击“+”按钮,添加了所有有问题的文件,然后立即编译。 哇。苹果真的需要重新考虑他们的错误信息。 解决此问题的另一种方法是选择据说丢失的文件。并打开“实用程序”滑出栏。 (那是最右边的那个)然后选择“文件检查器”。然后确保在“Target Membership”下的项目中有一个检查。我正在使用 Xcode 4.6.2 我不知道缺少哪个文件,所以我在助手编辑器(第二个编辑视图)中显示了构建阶段。我在左侧编辑视图中打开了有问题的文件,并检查了每个导入的文件是否存在于 Build Phases 中。我添加了一个没有的,它已经解决了。【参考方案3】:我遇到了类似的问题,我必须在每个项目配置(调试、发布和部署)和目标的构建设置中检查“仅构建活动架构”。
【讨论】:
也对我有用。虽然只是在主项目中需要。 我遇到了同样的问题。Build Active Architecture Only
的设置在 Pods
和我的项目之间是不同的。在链接阶段,它失败了。【参考方案4】:
“未定义符号”链接器错误的另一个可能原因是尝试从 .mm 文件调用 C 函数。在这种情况下,您需要在导入头文件时使用 extern "C" ...。
Linker error calling C-Function from Objective-C++
【讨论】:
【参考方案5】:我也有类似的问题。 _OBJC_CLASS_$_ 之后的班级名称实际上是我的班级。原因是我在将源代码文件拖入导航列表时没有勾选“添加到目标”。
我的解决方案是:
从导航列表中删除类并选择“仅删除引用”
再次拖动源代码文件并确保选中“添加到目标”复选框。复选框位于“如果需要则复制”和“创建组”下方。
【讨论】:
只是补充一点:虽然这不是最常见的错误原因,但我只是你的回答(没有勾选方框)现在发生在我身上。【参考方案6】:通常有一个没有版本标识符的别名链接到当前版本,在这种情况下,libz.dylib 链接到 libz.1.2.5.dylib。使用基本别名而不是版本别名。
【讨论】:
【参考方案7】:我在使用 admob 库时遇到了同样的问题,我修复了它,将“架构”更改为“标准架构 armv7、armv7s”,不包括 64 位。
【讨论】:
【参考方案8】:在目标 -> 构建设置 -> Apple LLVM 编译器语言下: 将“C++ 语言方言”和“C++ 标准库”设置为编译器默认值有助于解决它。
【讨论】:
【参考方案9】:我只将 libz.1.2.5.dylib 添加到我的项目中,它就像一个魅力。
步骤 -
-
转到构建阶段。
将二进制文件与库链接 - 使用“+”按钮选择要添加的框架和库。
从列表中选择 libz.1.2.5.dylib。
构建并运行。
【讨论】:
【参考方案10】:我遇到了类似的问题并看到与“std::”相关的错误
我更改了构建设置 -> Apple LVM 5.0 - 语言 C++ -> C++ 标准库
来自 libc++(支持 C++11 的 LLVM C++ 标准库) 到 libstdc++(GNU C++ 标准库)
【讨论】:
【参考方案11】:如果您的 Target > Build Settings > Other Linker Flags 下有标志 -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
【讨论】:
【参考方案12】:我在 .h 文件中有多个 @interfaces,但尚未包含所有相应的 @implementation 指令。确保它们都平衡了。
【讨论】:
【参考方案13】:这是我遇到此问题的原因:
我从另一个项目中添加了 .h、.m 和 NIB,方法是将它们拖到我的项目导航器上。 Xcode 没有正确地将它们添加到构建阶段。
检查my answer,因为我有一个类似的问题,我可以通过执行一些步骤来解决。
【讨论】:
【参考方案14】:如果您正在处理 iOS5 升级,我发现要编译一个写入目标 4.3 的项目,我可以将项目导航器中的 libz.1.2.3.dynlib 重命名为 libz.1.2.5.dynlib 和它编译。
我的 iPhoneOS50SDK/usr/lib 文件夹没有 libz.1.2.3.dynlib——不知道是测试版还是自然升级。
【讨论】:
【参考方案15】:进入你的项目,点击构建阶段,编译源代码,将 GameCenterManager.m 添加到列表中。
【讨论】:
【参考方案16】:您的目标中可能缺少某些类。当您将新的类文件重命名/删除/添加到项目中时,通常会发生这种情况。修复将新添加的类添加到某些目标。
在 Project Navigator(右侧栏)中选择类,打开 Utilities 侧栏(右侧栏),从 Utilities 中选择 File Inspector(类似文件的图标),在 Target Membership 选项卡下勾选您的目标。这一切都是为了避免“删除引用”并通过勾选“添加到目标”技巧再次添加。
所以:选择类 -> 实用程序(文件检查器) -> 目标成员 -> 勾选你想要的目标。
【讨论】:
【参考方案17】:这解决了我的问题:我使用的依赖项不支持 armv7。所以我别无选择,只能删除它。无论如何,Armv7 仅用于非常旧的 iphone(如 iphone 4)。
转到“构建设置/全部” 将“有效架构”设置为“arm64 arm64e”【讨论】:
【参考方案18】:我在这里没有找到这个建议,所以这里是: 如果您的项目有多个目标(即一个用于 OSX,一个用于 iOS),那么您必须为每个目标链接相关库.. 例如,在我的情况下,我需要 AudioToolbox.. 我有为 OSX 添加一次,为 iOS 添加一次(在 frameworks 文件夹下,每个目标的每个库都必须有一个副本。如果你只看到一个。那么这是一个危险信号)
【讨论】:
这个答案对我有帮助。然而,我的情况更加直接......我只是忘记添加我的代码库引用的框架。就我而言,我未能加载 AVFoundation.framework。 是的,我只是忘记在“Link Binary with Libraries”阶段添加一个框架。【参考方案19】:我遇到了 PJSIP 库的问题,
在项目的其他链接器标志中尝试了以下方法并能够解决错误: -框架 基础 -框架 UIKit
以上链接器标志用于Siphone Project over github。这些设置将帮助您解决与 C++ 库链接相关的问题。
【讨论】:
我在使用 PJSIP 库时遇到了同样的问题,你能详细解释一下解决方案吗 在项目构建设置的其他链接器标志中设置以下值:-framework Foundation -framework UIKit 错误消息:忽略文件/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”,引用自: 您似乎正试图在模拟器上运行应用程序,而 libyuv.a 不是为模拟器架构 i386 构建的。尝试直接在设备上运行应用程序 我想在 Swift 中集成 Pjsip。我尝试创建桥接头,但没有奏效。你能给我一些想法吗?【参考方案20】:我终于想通了,我通过向 target->Build Phases->Link Binary With Libraries 添加缺少的框架解决了这个问题
【讨论】:
【参考方案21】:我曾经遇到过这个问题。我意识到在移动班级时,我已经用目标文件夹上的.h
文件覆盖了.mm
文件。
修复该问题修复了错误。
【讨论】:
【参考方案22】:我在尝试编译将“C++ 标准库”的目标构建设置设置为“libc++”的项目时收到“架构 armv7 的未定义符号:”错误(这是必要的,因为该项目正在使用 C++ 11 中的某些功能),并且该项目包含一个子项目,该子项目的设置设置为“libstdc++”(或当前的编译器默认值)。
将子项目的“C++ 标准库”设置更改为 libc++ 即可解决此问题,但前提是先将子项目的部署目标设置为 5.0 或更高版本(libc++ 需要 5.0)。
【讨论】:
【参考方案23】:我给你更多建议,当其他常见建议没有帮助时,你可以查看。
如果你链接到其他项目(libxxx.a),你有时可能会遇到奇怪的问题,你可以用 nm 之类的工具找到符号,但他们在 ld 中找不到符号。然后你应该检查两个项目是否构建在相同的标志中,其中一些可能会影响二进制格式。
-
检查 c++ 编译器。
检查 c++ 方言设置。
检查 C++ 运行时类型支持。 (-frtti/-fnortti)
检查是否有同名的.a 出现在其他地方,可能超出链接路径列表中的所需文件。删除它们。
【讨论】:
【参考方案24】:我在 iphone5s 上运行应用程序时遇到了这个问题,通过将 arm64 添加到 Architectures 解决了这个问题。
【讨论】:
【参考方案25】:我遇到了同样的问题。我从大量答案中尝试了所有事情,但最后我的问题是: 我正在使用 openCV,所以我需要在我的代码中结合 C++ 代码。为此,您应该将使用 Objective-c 和 C++ 的文件更改为 .mm 我没有更改一个文件,并且该文件与 C++ 代码无关,但我必须更改它。
【讨论】:
【参考方案26】:我在安装 shareKit 时遇到了这个问题。它在模拟器中有效,但在设备上无效。我从 Other Linker Flag 中删除了 -all_load,并且在模拟器和 iphone 设备中一切正常。
【讨论】:
【参考方案27】:就我而言,我添加了一个必须使用 Objective C++ 的框架。我找到了这篇文章:
XCode .m vs. .mm
这解释了如何将 main.m 重命名为 main.mm,以便也可以编译 Objective-C++ 类。
这为我解决了问题。
【讨论】:
【参考方案28】:当模块(文件 .m)不在我正在使用的目标中时,我常常会遇到这个问题。
【讨论】:
【参考方案29】:对我来说,问题是我忘记在 .m(实现)中为我的常量设置值
file const kFooKey = @"Foo";
【讨论】:
【参考方案30】:我还通过拖放添加了文件。我所做的,我删除了所有文件的引用(不包括 frameworks
),然后通过 Add Files To Project 选项再次正确添加它们,问题消失了。
【讨论】:
以上是关于架构 armv7 的未定义符号的主要内容,如果未能解决你的问题,请参考以下文章