satinder
satinder

Reputation: 183

Error: ld: warning: ignoring file libfile01.a, file was built for archive which is not the architecture being linked (armv7): libfile01.a

I'm trying to compile a project developed in C language for iOS devices. It uses custom library file, libcurl, libcrypto, libssl and libpthread. I have successfully compiled it for Mac OS X, but having issues compiling it for iOS. Also, any help I try to find online is more of Xcode GUI help, and I need command line help for it. Need to compile it through commands instead of Xcode GUI.

First it needs to compile couple of C files, then make a static library file out of these compiled files, which further used when compiling a native binary.


This is how I generated iOS arm ouptut files from c files inside file01:

Store the iphoneos sdk path in environemnt variable:

CC="$(xcrun --sdk iphoneos9.2 --find clang) -isysroot $(xcrun --sdk iphoneos9.2 --show-sdk-path) -arch armv7 -arch armv7s -arch arm64 -arch armv6 -arch arm64"

Compile the c files in file01 with command: $CC -c -O2 *.c

To check which architect these files are compiled for can be checked with this lipo command. Example:

$ lipo -info example_file01.o 
Architectures in the fat file: example_file01.o are: armv7 armv7s armv6 arm64

To make a static library file I can get iOS ar file path using command:

$ xcrun --sdk iphoneos9.2 --find ar /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar

I could store the path in an environment variable, but it was not working throwing error not recognising ar command arguments rcu. So, used the ar path instead to create the library file with this command:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar rcu ../output/libfile01.a *.o

If checking which architectures this lib file supports it gives this output:

$ lipo -info ../output/libfile01.a 
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: archive with no architecture specification: ../output/libfile01.a (can't determine architecture for it)

But, it should have given output similar to this one:

$ lipo -info ../ios/lib/libcurl.a 
Architectures in the fat file: ../ios/lib/libcurl.a are: i386 armv7 armv7s x86_64 arm64

This is causing error when trying compiling files in using the generated static lib file with command:

$CC -o ../output/FinalProjectFile -O2 *.c ../output/libfile01.a ../ios/lib/libcurl.a ../ios/lib/libssl.a ../ios/lib/libcrypto.a -lpthread -lm

Error: ​ld: warning: ignoring file ../output/libfile01.a, file was built for archive which is not the architecture being linked (armv7): ../output/libfile01.a​

Thanks for help

Upvotes: 3

Views: 1878

Answers (1)

satinder
satinder

Reputation: 183

I finally solved the issue by using different argument for ar.

Instead of using

$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar rcu ../output/libfile01.a *.o

used

$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar -rcs ../output/libfile01.a *.o

The only difference was it's -rcs instead of rcu.

When checking the info of this libfile it shows the output like this:

$ lipo -info ../output/libfile01.a 
Architectures in the fat file: ../output/libfile01.a are: armv7 armv7s armv6 arm64

Upvotes: 2

Related Questions