Undefined symbols for architecture armv7
Asked Answered
C

40

321

This problem has been driving me crazy, and I can't work out how to fix it...

    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

I think it has to do with:

ld: symbol(s) not found for architecture armv7

But I have added: libz.1.2.3.dylib and it's not helping, anyone got any ideas?

Consumerism answered 21/6, 2011 at 17:33 Comment(5)
Another possibility not covered in any of the existing answers is that you might be using the -ObjC other linker flag and so Obj-C from external static libraries that you're using which shouldn't be visible (such as from Parse's), are visible. See my answer if this is the case: https://mcmap.net/q/35638/-undefined-symbols-for-architecture-armv7Meddle
As a rule of the thumb, somethimes XCode gives the kind of errors like Match-O and symbol not found for architecture i386 (or other) when files were not added to the project. Yo can right click on the project folder and do "Add file to <project>".Stemware
You can actually see the concrete symbols generated using the nm tool. Terminal to the path of the .o files, and run nm -g on the file that is calling the symbol and the one that should have the symbol, and you should see if they match up or not, which can provide clues for the error. nm -g file.o You can inspect the C++ symbols demangled with this: nm -gC file.oEuniceeunuch
Can someone here please help me? I am getting the below error but none of the above solution works for me. I have already spent days with all possible settings. 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)Villon
I fixed similar error with this way https://mcmap.net/q/35681/-xcode-12-5-building-for-ios-armv7-but-attempting-to-link-with-file-built-for-ios-arm64-problemCrematorium
F
512

Common Causes

The common causes for "Undefined symbols for architecture armv7" are:

  1. You import a header and do not link against the correct library. This is common, especially for headers for libraries like QuartzCore since it is not included in projects by default. To resolve:

    • Add the correct libraries in the Link Binary With Libraries section of the Build Phases.

    • If you want to add a library outside of the default search path you can include the path in the Library Search Paths value in the Build Settings and add
      -l{library_name_without_lib_and_suffix} (eg. for libz.a use -lz) to the Other Linker Flags section of Build Settings.

  2. You copy files into your project but forgot to check the target to add the files to. To resolve:

    • Open the Build Phases for the correct target, expand Compile Sources and add the missing .m files. If this is your issue please upvote Cortex's answer below as well.

  3. You include a static library that is built for another architecture like i386, the simulator on your host machine. To resolve:

    • If you have multiple library files from your libraries vendor to include in the project you need to include the one for the simulator (i386) and the one for the device (armv7 for example).

    • Optionally, you could create a fat static library that contains both architectures.



Original Answer:

You have not linked against the correct libz file. If you right click the file and reveal in finder its path should be somewhere in an iOS sdk folder. Here is mine for example

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

I recommend removing the reference and then re-adding it back in the Link Binary With Libraries section Build Phases of your target.

Footrace answered 21/6, 2011 at 17:38 Comment(7)
It may also be because you need to add the word "-licucore" in project settings / Other Linker Flags. It was added automatically for my debug build but not the release one so wouldn't compile.Grandnephew
I had the same issue. Didn't really read the install notes properly so hadn't noticed that the new version of bugsense needs libz binary added in the build phases.Playmate
Are you sure that you've included an @implementation section in your respective .m file for all classes you've declared in your header file?Regeniaregensburg
I just want to add I think it was really respectful of you to reference another answer to this question and tell us to up vote it if that helped.Gabrielagabriele
Thanks for help! :) For me helped typing explicitly in Other Linker Flags section: -framework <FrameWorkName>. I had problem with XCTest, so I had to add -framework XCTest. Thanks! :)Rib
I had this happen due to #1 where I had the same library name twice in the library search path and it was picking up the wrong one, even when I changed the order of directories in Xcode's project settings. Once I removed the incorrect library .a file it fixed it.Coaming
Can someone here please help me? I am getting the below error but none of the above solution works for me. I have already spent days with all possible settings. 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)Villon
H
197

I had a similar issue last night and the problem, was related to the fact that I had dragged a class from the Finder to my project in Xcode.

The solution was to go the the Build Phases tab and then the Compile Sources and make sure you drag the class to the list.

Helmand answered 16/4, 2012 at 7:39 Comment(7)
I wish I had realized this was the answer I was looking for earlier- Alternatively you can make sure to check 'Add to targets' when copying classes.Infecund
Whoa...so glad the fix was this easy! To be clear, if you add a class by dragging from the finder into your project, XCode doesn't always add them to your build phases list apparently. I just hit the "+" button in "Compile Sources" under build phases, added all the offending files, and it compiled straight away.Oconnell
Wow. Apple really needs to reconsider their error messages.Danicadanice
Another way to fix this is select file that is said to be missing. and open the "Utilities" slide out bar. (Thats the far right one) And choose the "File Inspector". Then make sure there is a check in the project under "Target Membership". I'm using Xcode 4.6.2Everglades
I didn't know which file was missing, so I showed the Build Phases in the assistant editor (the second editing view). I opened the offending file in the left editing view and checked that each of the imported files existed in Build Phases. I added the one that didn't and it was resolved.Early
Have to agree with Reuben. After working with Visual Studio and Netbeans, Xcode is a real disappointment (so ridiculously complicated).Decant
Can someone here please help me? I am getting the below error but none of the above solution works for me. I have already spent days with all possible settings. 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)Villon
L
38

I had a similar issue and I had to check "Build Active Architecture Only" on each of the Project configurations (Debug, Release and Deployment) and in the Build Settings of the Target.

Letta answered 19/12, 2011 at 23:52 Comment(2)
Also did the trick for me. Was just needed in the main project though.Concordat
I encounter the same issues. The Build Active Architecture Only settings are different between Pods and my project. At the link stage, it failed.Bosworth
C
21

Another possible cause of "undefined symbol" linker errors is attempting to call a C function from a .mm file. In this case you'll need to use extern "C" {...} when you import the header files.

Linker error calling C-Function from Objective-C++

Consentaneous answered 13/3, 2013 at 18:33 Comment(0)
F
14

I had a similar issue with that. The class name after _OBJC_CLASS_$_ was actually my class. The reason was I didn't tick "Add to Target" when I drag the source code files into navigation list.

My solution was:

  1. delete the class from the navigation list and choose "remove reference only"

  2. drag the source code files again and make sure the tick box for "add to Target" is ticked. The tick box is just under "Copy if needed" and "Create group".

Final answered 9/5, 2012 at 0:32 Comment(1)
Just to add: although this is NOT THE MOST COMMON CAUSE of the error, I just your answer (didn't tick the box) happen to me now.Lunatic
K
8

There is usually a alias without the version identifier that is linked to the current version, in this case libz.dylib is linked to libz.1.2.5.dylib. Use the base alias instead of the versioned one.

Kelleher answered 25/9, 2011 at 12:16 Comment(0)
S
7

I had the same problem when I use admob library, I fixed it changing "Architectures" to "Standard architectures armv7, armv7s" without including 64-bit. Build Settings

Skull answered 29/11, 2013 at 10:9 Comment(0)
C
5

Under Target -> Build Settings -> Apple LLVM compiler language: setting 'C++ Language Dialect' and 'C++ Standard Library' to Compiler default helped solve it.

Castorina answered 6/11, 2012 at 22:22 Comment(0)
C
5

I only added the libz.1.2.5.dylib to my project and it worked like a charm.

Steps -

  1. Go to Build Phases.
  2. Link Binary With library - use the '+' button to choose frameworks and libraries to add.
  3. Select libz.1.2.5.dylib from the list.
  4. Build and run.
Copter answered 22/8, 2013 at 9:3 Comment(0)
C
5

I had a similar issue and saw errors related to "std::"

I changed Build Settings -> Apple LVM 5.0 - Language C++ -> C++ Standard Library

from libc++ (LLVM C++ Standard Library with C++11 support) to libstdc++ (GNU C++ Standard Library)

Contuse answered 15/11, 2013 at 20:14 Comment(0)
M
5

If you have the flag -ObjC under your Target > Build Settings > Other Linker Flags and you're getting this issue, consider removing it. If you intentionally added it because you need to load some Obj-C code from a static library that wouldn't normally be loaded otherwise, IE, an Obj-C category, then you should use -force_load <path> instead of -ObjC.

<path> should be relative to your Xcode project directory. IE, if your directory structure looks like this:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Then you should have this flag set for Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

If you want to include multiple libraries like that, then you should include a separate -force_load line for each of them.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
Meddle answered 1/10, 2014 at 21:45 Comment(0)
S
4

Here's how I got this problem:

I added a .h, .m and NIB from another project by dragging them onto my project navigator. Xcode didn't add them to the Build Phases properly.

Check my answer because I had a similar problem that I was able to solve by doing some steps.

Studbook answered 2/5, 2012 at 14:42 Comment(0)
O
4

Probably some classes are missing from your target. This usually happens when you rename/remove/add new classes files to your project. To fix add the newly added classes to some targets.

Select the class in the Project Navigator (right sidebar) , open the Utilities sidebar (right sidebar), from the Utilities select the File Inspector (file like icon), under the Target Membership tab tick your targets. This is all to avoid the "Remove reference" and add again with ticking "Add to targets" trick.

So: Select Class -> Utilities (File Inspector) -> Target Membership -> Tick the targets you want.

Opiumism answered 29/11, 2012 at 12:35 Comment(0)
S
4

I have have multiple @interfaces in the .h file and hadn't yet included the all of the corresponding @implementation directives. Make sure that they are all balanced out.

Shawn answered 17/4, 2013 at 22:27 Comment(0)
B
3

if you're dealing with the iOS5 upgrade, I found that for compiling a project written to target 4.3, I could just rename libz.1.2.3.dynlib in the Project Navigator to libz.1.2.5.dynlib and it compiled.

My iPhoneOS50SDK/usr/lib folder has no libz.1.2.3.dynlib--don't know whether it's a beta thing or just natural upgrade.

Beltz answered 18/9, 2011 at 19:16 Comment(0)
T
3

Go to your project, click on Build phases, Compile sources, Add GameCenterManager.m to the list.

Toaster answered 13/10, 2012 at 19:1 Comment(0)
H
3

This fixed my problem: The dependency I am using is not supporting armv7. So I had no other option than to remove it. Armv7 is used for only very old iphones anyway (like iphone 4).

  • Go 'Build Settings / All'
  • Set 'Valid Architectures' to 'arm64 arm64e'
Haemostasis answered 25/5, 2020 at 14:43 Comment(0)
B
2

I didn't find this suggestion here so here it goes: if your project has more than one target (ie one for OSX and one for iOS) then you must link the relevant libraries for each target.. so for example in my case I needed AudioToolbox.. I had to add it once for OSX and once for iOS (under the frameworks folder, you must have a duplicate of each library for each target.. if you see only one.. then that's a red flag)

Basanite answered 4/11, 2012 at 7:55 Comment(2)
This answer helped me. However, my situation was even more straight forward... I simply forgot to add a framework that my codebase referenced. In my case I failed to load AVFoundation.framework.Mangrum
Yep, I simply forgot to add a framework under the "Link Binary with Libraries" phase.Civility
Q
2

I was facing an issue with PJSIP libraries,

Tried the following in other linker flags in project and able to resolve the error: -framework Foundation -framework UIKit

Above linker flags are used in Siphone Project over github. These settings will help you resolve problems related to linking of C++ libraries.

Quartis answered 30/5, 2013 at 13:10 Comment(5)
I am having the same problem with PJSIP librabries, Can you explain the solution in detailEldrid
Set the following values in other linker flags of project build setting: -framework Foundation -framework UIKitQuartis
Error Message: ignoring file /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, file was built for archive which is not the architecture being linked (i386): /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Undefined symbols for architecture i386: "_pjsip_register_method", referenced from:Eldrid
It seems like you are trying to run app on simulator and libyuv.a is not built for simulator architecture i386. try running app on device directlyQuartis
I want to integrate Pjsip in Swift. I tried creating bridging headers but it did not worked. Can you give me some idea?Eldrid
S
1

Finally i've figured it out, I solved this issue by adding absent framework to target->Build Phases->Link Binary With Libraries

Sexpartite answered 21/2, 2013 at 14:23 Comment(0)
P
1

I once had this problem. I realized that while moving a class, I had overwritten the .mm file with .h file on the destination folder.

Fixing that issue fixed the error.

Pastelki answered 11/3, 2013 at 22:15 Comment(0)
M
1

I received the 'Undefined symbols for architecture armv7:' error when trying to compile a project that had the target build setting for 'C++ Standard Library' set to 'libc++' (necessary as the project was using some features from C++ 11), and the project included a sub-project that had the same setting set to 'libstdc++' (or compiler default as it is currently).

Changing the sub-project's 'C++ Standard Library' setting to libc++ fixed it, but only after first setting the deployment target for the sub-project to 5.0 or above (5.0 is necessary for libc++).

Microchemistry answered 7/6, 2013 at 23:21 Comment(0)
I
1

I give you more suggestions that you can check when other common suggestions are not help.

If you link with other project(libxxx.a) you might sometimes meet strange problem which you can find the symbol with tools like nm but they just can not find the symbols in ld. Then you should check if the two projects are built in the same flags, some of them may affect the binary format.

  1. check c++ compiler.
  2. check c++ dialect setting.
  3. check c++ runtime type support. (-frtti/-fnortti)
  4. check if there is .a with the same name appears elsewhere, could be beyond the wanted file in the link path list. remove them.
Incumber answered 13/6, 2013 at 6:16 Comment(0)
H
1

I got this problem when I run app on iphone5s, it was solved by add arm64 to Architectures.

Hogarth answered 27/11, 2013 at 11:39 Comment(0)
P
1

I had the same problem. I tried every thing from the huge list of answer but in the end my problem was: I'm working with openCV so I need to combine C++ code in my code. To do this you should change the files which use objective-c and C++ to .mm I didn't changed one file and this file has no connection to the C++ code but I had to change it.

Plate answered 24/1, 2014 at 0:9 Comment(0)
S
1

I had this issue, when installing shareKit. It worked in the simulator, but not on the device. I removed -all_load from the Other Linker Flag and everything works fine in both simulator and iphone device.

Solnit answered 8/2, 2014 at 15:44 Comment(0)
M
1

In my case, I'd added a framework that must be using Objective C++. I found this post:

XCode .m vs. .mm

that explained how the main.m needed to be renamed to main.mm so that the Objective-C++ classes could be compiled, too.

That fixed it for me.

Maddox answered 11/11, 2014 at 19:16 Comment(0)
F
1

I use to face that issue when the module (file .m) is not in the target that I am working with.

Famous answered 11/2, 2015 at 7:51 Comment(0)
F
1

For me the problem was that i forget to set value for my constants in the .m (implementation)

file const kFooKey = @"Foo";
Frerichs answered 2/3, 2015 at 13:46 Comment(0)
E
1

I also added files through Dragging and Dropping. What I did, I removed references of all the files (Excluding frameworks) then added them again properly via Add Files To Project option, problem gone.

Electrocautery answered 27/3, 2015 at 11:29 Comment(0)
I
1

If you're building from Unity3D 5 and also using a Prime31 plugin and you're getting this error it's probably due to a duplicate .dll. If you look through your warnings in Unity's editor one of them will tell you this and warn that it could cause build errors. To see if this is the case, type P31 in your project search field and it should pop right up, maybe even more than one. The duplicate's will have a ' 1' at the end of the file name. This is probably caused from updating the plugin in editor via the store or the Prime31 menu tab.

Ingather answered 28/5, 2015 at 5:25 Comment(0)
N
1

For what it is worth, mine was fixed after I went to target->Build Phases->Link Binary With Libraries, deleted the libstdc++.tbd reference, then added a reference to libstdc++.6.0.9.tbd.

Neustria answered 15/10, 2016 at 7:3 Comment(0)
S
0

I was facing the same problem when I included one third party framework.

The issue got resolved when I removed armv7s from the Valid Architectures entry in Build Settings of the target, it starts working.

Supranational answered 21/5, 2013 at 12:48 Comment(0)
B
0

rename your m file (which includes methods funcs) to mm or vice versa will fix your problem. mine solved renaming mm to m or m to mm.

Bramwell answered 2/8, 2013 at 14:47 Comment(0)
K
0

Try to implement at least one non-inline function of your derived class. If you don't do this, the linker might avoid creating type info for that class.

Kym answered 5/10, 2014 at 14:50 Comment(0)
D
0

In Xcode Version 6.3.2 , I solved the exactly same problem by adding Library libxml2.dylib and libz.dylib In Link Binary With Libraries !

Dockhand answered 25/6, 2015 at 16:1 Comment(0)
D
0

In my case, I had a similar problem when I created a new branch under source control.

I was able to resolve this problem by simply going Product>Clean

Defeatism answered 31/10, 2015 at 5:45 Comment(0)
S
0

I had this warning, when wrote two classes in .h file of another class, but FORGOT to write the implementation for this classes in .m file.

Stent answered 24/10, 2016 at 11:29 Comment(0)
D
0

Go TARGETS -> General -> Deployment Info -> set Target 8.1 or 10.0

Framework or Library have no ARMV7 Architecture.

Duly answered 29/1, 2020 at 7:12 Comment(0)
T
0

If you faced this issue with your Flutter project while building in Release mode - that's what helped me:

  1. Set your build system to New Build System in File > Project Settings…
  2. delete folders ios and build_ios from your project folder.
  3. create ios module by executing flutter create . from your project folder.
  4. open Xcode and:

    • set the IOS Deployment Target to at least 9.0 in PROJECT > Runner
    • check your Signing & Capabilities
    • make sure your Build Configuration is set to Release in Edit Scheme... and build for Generic iOS Device
  5. execute pod install from your project folder

  6. execute flutter pub get from your project folder

now open your Xcode and build or archive it: Product > Build (or Archive)

Transcurrent answered 26/4, 2020 at 19:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.