I've created a Swift framework project for util/extensions that compiles and copies a .framework
file to a dedicated location on my system. I want to be able to include this file into other projects (Build Phases/Link Binary with Libraries). The framework project is a Cocoa Touch Framework type project (as selected from Xcode 6.1 project template browser).
But when I try compiling a project which links the framework file, I'm getting this warning:
ld: warning: ignoring file /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils, file was built for x86_64 which is not the architecture being linked (i386): /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils
Is there anything I can do with the framework project so that it is valid for other iOS projects? It's confusing because the framework project is a Cocoa Touch Framework project which should naturally work with other Cocoa Touch (i.e. IOS) projects, shouldn't it?
Make sure you have
i386
andx86_64
listed in your Architectures in Build settings for your lib. Also set Build Active Architecture Only explicitly to No.While the accepted answer has solved the problem, here is a little more since the problems is about the architecture, literally the binary files
1. Architecture in iOS
the above list is downward compatible, which means iPhoneX can runs with armv6 as well, and just can not fully utilize the functions of armv64
more info about iOS architectures can be found here: https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html
2. What is Build Active Architecture Only?
If selected "Yes", it will only build your framework to the "selected device", either real devices(armv) or simulator(x86_64 or i386). For "No", it will build your framework to your list of "Valid Architectures"
By default, in debug mode, it is "Yes"; and in release more, it is "No", which can save compiling time in debug mode and ensure your release project framework runs on all architectures that you specified.
Thats why the accepted answer worked by forcing the framework to build for all architectures, however by reading more you will know what is behind and can definitely save time in compiling your framework. Of course, more control in yourself as well.
So, if you are working on a framework, and want to import to another project, if you compile the framework with Build Active Architecture Only "Yes" with simulator(i386 or x86_64), and then import to your project with Build Active Architecture Only "Yes" with a real device(armv), you will encountered this error.
Looking to the error description:
while a more common would be:
3. Extracting the framework
A common practice would be right click the framework and select Show In Finder, while most developers keep the Finder open, and the newly compiled framework will replace the old one, without closing Finder and reopen again. Yes it is right, but if you switched the build target device in between, the frameworks will result in different folders. Sometimes you think you have compiled your framework but indeed it is in another folder. My suggestions would be always select Show in Finder to prevent the framework you import is not the latest one.
The two different folders: Debug-iphoneos and Debug-iphonesimulator
I ran into this problem and the current solution got rid of the original error (i.e. unable to link i386), but then linked Frameworks (such as Alamofire) could not be imported into my project. The following solution fixed this problem.
Build Settings
->Architectures
->Valid Architectures
, add the valuei386
.Next, delete the contents of your project's derived data folder. The contents of this folder are generated during build time and can be safely removed and Xcode will create a new one. To delete this folder in Xcode 8, go to
File
->Project/Workspace Settings
, click on the grey arrow to open the folder location in Finder, and delete the contents.Clean and rebuild.
If the build still fails, check the issue navigator for something that says
Update to recommended settings
. Click it and try again.If you don't see that option, change
Build Active Architecture Only
toYes
in build settings. This slows down build times which can be frustrating when switching between different devices frequently, however it might be necessary.I also found that if you are using frameworks through cocoapods as I was, I had to go to the Pods project, and apply solutions by @dogsgod and @darksinge for every framework target in the Pods project. That is, I had to turn off build for active architectures only and add X86_64 and i386 in valid architectures.