After update to Xcode 5 - ld: symbol(s) not found for architecture armv7 or armv7s linker error

60,629

Solution 1

Short answer:

  • Remove Build Active Architecture Only (build setting parameter key is 'ONLY_ACTIVE_ARCH') from all of your static libraries' project build settings or overwrite it with 'NO' like in the screenshot below: Overwrite 'Build Active Architecture Only' to 'NO' or delete it's entry completely to fallback to iOS Default

Detailed answer:

The problem is that your static library 'libCordova.a' which you're linking in your main app is only compiled for one architecture (armv7, but not armv7s).

You've probably let Xcode perform all the recommended changes for your static libraries project without reading what these changes actually are. Speaking for myself, I've never bothered to take a closer look at that info dialog (screenshot below), when I switched over to a new version of Xcode -- until now. enter image description here

The problem is that performing these changes activates for debug builds a new feature called Build Active Architecture Only (build setting parameter key is 'ONLY_ACTIVE_ARCH'). In principle, this is a very cool enhancement of Xcode, because setting this to YES leads to faster building times, as Xcode only compiles the architecture of the connected device you've currently selected at the top when you hit the run button.

However, when blindly accepting this new parameter in a static library, you may run into this bug. The bug occurs when you've built the debug version of a static library while having connected an armv7 device, and then, when you're debugging your main application, you've connected an armv7s device (or vice versa). Subsequently you'll get the error above (or a similar one).

So my recommendation is to completely remove the value at project level for Build Active Architecture Only from all of your static libraries' project build settings. Because if you take a look at the iOS default, it is NO. Of course you can also overwrite the setting to 'NO' to be sure the setting is correct even if in the future the default value will change (cf. 1st screenshot).

Solution 2

If your project was built using Cordova 2.x and Xcode 4.x, and you are receiving the error mentioned by the OP, this solution worked for me. (I was experiencing the error with Cordova 2.5 and Xcode 5).

https://issues.apache.org/jira/browse/CB-3768

Go to your Cordova Project

Root Folder -> CordovaLib -> Right Click CordovaLib.xcodeproj -> Show Package Contents -> Open project.pbxproj

Replace all occurrences of (I had 4)

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
        /* other settings here */
};

With this

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos7.*]" = (
        armv7,
        armv7s,
    );
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
    /* other settings here */
};

Now your project will build fine!

Solution 3

I have removed armv7s from valid architectures section and it worked for me.

Build Settings --> Architectures --> Valid Architectures

Xcode Build Settings

Solution 4

I am using Xcode 5 so iOS SDK 7. The solution which worked for me was simply to remove the arm64 architecture.

Select the project target (NOT CordovaLib.xcodeproj) and in the build settings>Valid Architectures, remove arm64 if it's there in the list. Here is mine after I remove arm64 architecture.

enter image description here

Solution 5

Because my lib.a is for only armv7

what i did was

Active Architecture Only = yes

buildSettings = {
                ALWAYS_SEARCH_USER_PATHS = NO;
                "ARCHS[sdk=iphoneos*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos6.*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos7.*]" = (
                    armv7,
                    armv7s,
                );

it was build and archived fine

hope it helps

Share:
60,629
barney
Author by

barney

Updated on July 05, 2022

Comments

  • barney
    barney almost 2 years

    I just updated my iPhone 4S software to iOS 7 Beta 2 while I was in the middle of putting the final touches on a new app (Phonegap).. not a good idea!

    After it was done Xcode didn't detect my iPhone so I installed Xcode 5 beta. After tinkering around with it I finally got it to detect my phone. The only problem now is there is an error with the architecture used.

    Here are the errors being produced:

    ld: warning: ignoring file /Users/-----------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a, file was built for archive which is not the architecture being linked (armv7s): /Users/--------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a
    Undefined symbols for architecture armv7s:
      "_OBJC_METACLASS_$_CDVCommandDelegateImpl", referenced from:
          _OBJC_METACLASS_$_MainCommandDelegate in MainViewController.o
      "_CDVLocalNotification", referenced from:
          -[AppDelegate application:didReceiveLocalNotification:] in AppDelegate.o
      "_OBJC_CLASS_$_CDVCommandDelegateImpl", referenced from:
          _OBJC_CLASS_$_MainCommandDelegate in MainViewController.o
      "_OBJC_CLASS_$_CDVCommandQueue", referenced from:
          _OBJC_CLASS_$_MainCommandQueue in MainViewController.o
      "_OBJC_METACLASS_$_CDVViewController", referenced from:
          _OBJC_METACLASS_$_MainViewController in MainViewController.o
      "_OBJC_METACLASS_$_CDVCommandQueue", referenced from:
          _OBJC_METACLASS_$_MainCommandQueue in MainViewController.o
      "_CDVPluginHandleOpenURLNotification", referenced from:
          -[AppDelegate application:handleOpenURL:] in AppDelegate.o
      "_OBJC_CLASS_$_CDVViewController", referenced from:
          _OBJC_CLASS_$_MainViewController in MainViewController.o
    ld: symbol(s) not found for architecture armv7s
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    Any ideas on what the architecture should be changed to in order to get it to work on my phone? (it's working fine on the emulator)

  • Van Du Tran
    Van Du Tran almost 11 years
    Didn't work for me. I'm on simulator. Anything else is missing?
  • user1264176
    user1264176 almost 11 years
    @Tafkadasoh do you happen to know how to disable this warning in Xcode 5 (Without disabling any other source code related warnings) ?
  • JA_251
    JA_251 almost 11 years
    A clarification that helped me use this info: Note that you need to make the suggested change in your CordovaLib.xcodeproj target (I'm using PhoneGap 2.9) and not just your PhoneGap app target. If you don't change it in the CordovaLib target, even a clean/build won't force the libCordova.a to be built with the right architectures.
  • Joe D'Andrea
    Joe D'Andrea almost 11 years
    I found this answer after figuring out essentially the same thing (thank you for validating what I thought was the correct solution!). Alas, it isn't making a difference, and I'm still getting lots of errors. (This all went south for me after trying to add arm64 to the mix, then changing it back.)
  • Dave Reynolds
    Dave Reynolds almost 11 years
    Worked perfectly for me with Cordova 2.7 and XCode 5.
  • JP Richardson
    JP Richardson almost 11 years
    The solution by Tafkadasoh did not work for me. This works perfectly! Thanks.
  • David Myers
    David Myers over 10 years
    I ran into this issue using Cordova 3.0 and XCode 5. This fix worked beautifully!
  • njtman
    njtman over 10 years
    I believe you can just clean your project, and that will force a rebuild of the library and will compile it for the device currently connected. There shouldn't be any need to change the Build Active Architecture flag, doing so will just make unnecessarily long build times when debugging. To clean your project in xcode, go to Product->Clean. (Or command + shift + K)
  • plang
    plang over 10 years
    Worked great for me, with a Cordova 2.6 project. I'm surprised the "iphoneos7.*" entry cannot be made through the xcode user-interface...
  • njtman
    njtman over 10 years
    I believe you can just clean your project, and that will force a rebuild of the library and will compile it for the device currently connected. There shouldn't be any need to change the Build Active Architecture flag, doing so will just make unnecessarily long build times when debugging. This should eliminate errors when deployed to different device types when debugging. To clean your project in xcode, go to Product->Clean. (Or command + shift + K)
  • ruzticgirlz
    ruzticgirlz over 10 years
    dear njtman,yes you are right, just clean project it 's work find for the connected device. But for me, I have to archive the project for not connected device. but whech i archive it ... the problem is still there. So I try this one and it work find for me :). btw, Thx for your tip.
  • Ghigo
    Ghigo over 10 years
    This seems not the case anymore with Cordova 3.1
  • njtman
    njtman over 10 years
    @Ghigo As my answer states, this solution is only for Cordova 2.x. These settings should already more or less exist in Cordova 3.x, because it supported iOS7 from the beginning.
  • Tomjr260
    Tomjr260 over 10 years
    Worked perfect for me! Thanks
  • jocull
    jocull over 10 years
    I went into the build settings for the Cordova lib and changed the Architectures drop-down to use "Standard Architectures". I believe this is equivalent - basically adding armv7s compilation to the list.
  • Tafkadasoh
    Tafkadasoh over 10 years
    @rkaartikeyan Just select the corresponding row in your project settings (cf. 1st screenshot) and hit the backspace key.
  • njtman
    njtman over 10 years
    can you elaborate on this? I tried to following your description in xcode, but I got lost. @jocull
  • jocull
    jocull over 10 years
    When you click on the project there is a section called "Build Settings" - you should be able to find it in there.
  • Gilad M
    Gilad M over 10 years
    Yes. I agree. This fixed my problem. Thanks.
  • Gowthami Gattineni
    Gowthami Gattineni over 10 years
    Thank you .It stopped working all of a sudden It took me hours to figure it out. This is helpful
  • Thomas - BeeDesk
    Thomas - BeeDesk over 10 years
    I was updating to Xcode 5.1 (which come out at the same time as iOS 7.1). I ended removing all Valid Architectures except armv7 armv7s. Then, my phonegap app compiles and builds.
  • Ankit
    Ankit over 10 years
    @Thomas-BeeDesk :But do you have idea what does this happen ? in a way we drop support to build64 bit binary and only 32 binary will be generated now ? any thoughts...and if the library do not support 64 bit , why there was no error when i run it on xcode 5.0 and ios 7.0 on a 64 bit device?
  • Thomas - BeeDesk
    Thomas - BeeDesk over 10 years
    @ankit, I believe all cpu in the iPhone is backward compatible (so far). The code in libCordova.a will run with only 32-bit instructions. The bulks of our app should be JavaScript executing inside a native UIWebView anyway, I don't think it really matter or would have significant perf impact.
  • Brad Griffith
    Brad Griffith over 10 years
    Worked for me with Cordova 3.4.0 and XCode 5.1, though I didn't have any ARCHS settings in my 2 configurations before I added the ones you recommended. Thanks so much!
  • islanddave
    islanddave over 9 years
    This solved my issue as well. It was in the CordovaLib where I had to set it to No.
  • June Wang
    June Wang over 5 years
    @hypery2k how do you know your lib.a is only for armv7?