架构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,它没有帮助,有人有什么想法吗?

386372 次浏览

常见的原因

导致“架构armv7中未定义的符号”的常见原因有:

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

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

    • 如果你想在默认搜索路径之外添加一个库,你可以在构建设置中的Library Search Paths值中包含该路径,并添加
      -l{library_name_without_lib_and_suffix}(例如。libz。用-lz) <强> < em > Other Linker Flags < / em > < /强>的<强> < em > Build Settings < / em > < /强>。

    • 李< / ul > < / >
    • < p >你将文件复制到项目中,但忘记检查要将文件添加到的目标。解决:

      • 打开正确目标的< em > Build Phases < / em >,展开< em > Compile Sources < / em >并添加缺少的.m文件。如果这是你的问题,也请给Cortex的回答如下投票
      • 李< / ul > < / >
      • 包括为另一种体系结构构建的静态库喜欢i386,你的主机上的模拟器。解决:

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

        • 可选地,您可以创建一个包含这两种架构的脂肪静态库

        • 李< / ul > < / >



最初的回答:

您没有链接到正确的libz文件。如果你右键点击该文件并在finder中显示它的路径应该在iOS sdk文件夹中的某个地方。这是我的例子

/开发/平台/ iPhoneOS.platform /开发/ sdk / iPhoneOS4.3.sdk / usr / lib

我建议删除引用,然后在目标的构建阶段Link Binary With Libraries部分重新添加它。

如果你正在处理iOS5升级,我发现要编译一个目标4.3的项目,我可以将libz.1.2.3重命名。dynlib的项目导航到libz.1.2.5。Dynlib和它编译。

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

别名通常不包含链接到当前版本的版本标识符,在本例中为libz。Dylib链接到libz.1.2.5.dylib。使用基本别名,而不是版本化的别名。

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

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

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

下面是我是如何得到这个问题的:

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

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

我也有类似的问题。在_OBJC_CLASS_$_后面的类名实际上是我的类。原因是我没有勾选“添加到目标”,当我拖动源代码文件到导航列表。

我的解决方案是:

  1. 从导航列表中删除类,并选择“仅删除引用”

  2. 再次拖动源代码文件,并确保“添加到目标”复选框被勾选。复选框就在“需要时复制”和“创建组”下面。

回到你的项目,点击Build phases, Compile sources, Add GameCenterManager。M到列表上。

我在这里没有发现这个建议,所以它是这样的: 如果你的项目有多个目标(即一个OSX和一个iOS),那么你必须链接相关的库为每一个 target..例如,在我的情况下,我需要AudioToolbox..我必须为OSX添加一次,为iOS添加一次(在框架文件夹下,必须为每个目标添加每个库的副本..如果你只看到一个..那么这是一个危险信号)

Under Target -> Build Settings -> Apple LLVM编译语言: 将“c++语言方言”和“c++标准库”设置为编译器默认值有助于解决这个问题。< / p >

目标中可能缺少一些类。这通常发生在你重命名/删除/添加新的类文件到你的项目。若要修复,请将新添加的类添加到某些目标。

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

所以:选择类 -> 公用事业(文件检查器) -> 目标会员 -> 蜱虫你想要的目标。

最后我想明白了,我通过添加缺少框架的目标->构建阶段->链接二进制库解决了这个问题

我曾经遇到过这个问题。我意识到在移动类时,我已经用目标文件夹上的.h文件覆盖了.mm文件。

修复这个问题就修复了错误。

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

从objective- c++调用C-Function的链接器错误

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

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

当我从目标的构建设置中的有效架构条目中删除armv7s时,问题得到了解决,它开始工作。

我遇到了一个PJSIP库的问题,

在项目中的其他链接器标志中尝试了以下内容并能够解决错误: 框架 基金会 框架 UIKit < / p >

上面的链接标志在Siphone项目在github中使用。这些设置将帮助您解决与c++库链接相关的问题。

当我试图编译一个将“c++标准库”的目标构建设置设置为“libc++”的项目时,我收到了“架构armv7的未定义符号:”错误(必要的,因为项目使用了c++ 11的一些功能),并且该项目包括一个具有相同设置设置为“libstdc++”的子项目(或编译器默认值,因为它目前)。

将子项目的“c++标准库”设置更改为libc++可以修复这个问题,但前提是首先将子项目的部署目标设置为5.0或以上(5.0对于libc++是必要的)。

我给你更多的建议,当其他常见的建议没有帮助时,你可以检查。

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

  1. 检查c++编译器。
  2. 检查c++方言设置。
  3. 检查c++运行时类型支持。(-frtti / -fnortti)
  4. 检查是否有相同名称的.a出现在其他地方,可能超出了链接路径列表中的所需文件。移除它们。
重命名你的m文件(包括funcs方法)为mm或反之亦然将解决你的问题。 我的解决了将mm重命名为m 或者m到mm

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

步骤 -

  1. 进入构建阶段。
  2. Link Binary With library -使用“+”按钮选择要添加的框架和库。
  3. 选择libz.1.2.5。列表中的Dylib。
  4. 构建并运行。

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

我改变了构建设置->苹果LVM 5.0 -语言c++ -> c++标准库

from libc++ (LLVM c++标准库与c++ 11支持) libstdc++ (GNU c++标准库)

当我在iphone5上运行应用程序时,我得到了这个问题,它通过添加arm64体系结构来解决。

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

我也有同样的问题。我尝试了答案列表中的每一种方法,但最终我的问题是: 我正在使用openCV,所以我需要在我的代码中结合c++代码。要做到这一点,你应该将使用objective-c和c++的文件更改为.mm 我没有改变一个文件,这个文件没有连接到c++代码,但我必须改变它

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

如果你的目标>构建设置>其他链接器标志下有-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

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

在我的例子中,我添加了一个必须使用Objective c++的框架。我找到了这个帖子:

XCode .m vs. mm

这说明了主要的。M需要重命名为main。mm,这样objective - c++类也可以被编译。

这为我解决了问题。

当模块(file .m)不在我正在使用的目标中时,我常常会遇到这个问题。

对我来说,问题是在忘记中为00(实现)中的常量设置值。

file const kFooKey = @"Foo";

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

如果你从Unity3D 5构建,也使用Prime31插件,你得到这个错误,这可能是由于重复的.dll。如果你查看Unity编辑器中的警告,其中一个警告会告诉你这一点,并警告它可能会导致构建错误。要查看是否是这种情况,在项目搜索字段中输入P31,它应该会立即弹出,甚至可能不止一个。副本的文件名后面会有一个“1”。这可能是由于通过商店或Prime31菜单选项卡在编辑器中更新插件造成的。

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

在我的例子中,当我在源代码控制下创建一个新分支时,我遇到了类似的问题。

我可以通过简单地执行Product>Clean来解决这个问题

为了它的价值,我的是固定后,我去了目标->构建阶段->链接二进制与库,删除libstdc++。TBD引用,然后添加了对libstdc++.6.0.9. TBD的引用。

我有这个警告,当在另一个类的.h文件中写两个类时,但忘记在.m文件中写这个类的实现。

Go TARGETS -> General -> Deployment Info ->设置目标8.1或10.0

框架或库没有ARMV7体系结构。

如果您在释放模式下构建您的Flutter项目时遇到了这个问题-这对我有帮助:

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

    • 在PROJECT > Runner中设置IOS部署目标至少为9.0
    • 检查你的签名&功能
    • 确保你的构建配置在编辑方案中设置为发布…并为通用iOS设备构建
    • 李< / ul > < / >
    • 在项目文件夹中执行pod install

    • 在项目文件夹中执行flutter pub get

现在打开你的Xcode并构建或存档它:Product > build(或archive)

这解决了我的问题:我正在使用的依赖不支持armv7。所以我别无选择,只能把它切除。Armv7只用于非常老的iphone(比如iphone 4)。

  • 点击“构建设置/全部”
  • 设置“有效架构”为“arm64 arm64e”