Error building xcode project when i add a library with extension .a - ios

I have an Xcode project and I need to add a static library with extension .a who sent me for integrated a functionality. I added the library in Build Phases - Link Binary With Libraries, but when I compile my project with this library I added, I does not compile and shows this error:
could not parse object file /routelibrary/libraryname.a(IosHttp.o): 'Unknown attribute kind (45)Unknown attribute kind (45)Unknown attribute kind (45)', using libLTO version 'Apple LLVM 7.0.0 (clang-700.0.72)' for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Any idea on how can I solve it?

One possible reason is missing Other Linker Flags in your target build settings.
First check if you need to set any Other Linker Flags in documentation of your static library, and if yes, what that flag is.
For example so many libraries needs -ObjC as Other Linker Flags.
To find Other Linker Flags, do following.
Select Build Targets in your Xcode project.
select Build Settings.
In Search Box type Other Linker Flags
check and set your flags here.

Related

Why can't I get rid of libstdc++?

Since upgrading to xcode 10 beta 6 I'm getting the error
ld: library not found for -lstdc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I know that libstdc++ has been removed from the iOS simulator but the project and all the targets have C++ Standard Library set to libc++, not libstdc++.
The project has nothing set in Other Linker Flags. The summary of the Other Links Flags for the target includes -stdlib=libstdc++
but when I double-click on it to edit it, it isn't in the list.
What is it that's sneaking libstdc++ in? Any help would be greatly appreciated!
It turned out the problem was that one of my dependencies was using libstdc++, so Cocoapods was adding the -stdlib=libstdc++ to the linker flags for the project.
The solution was to update the dependency to a newer version that had been built against libc++.
If anyone else has trouble identifying which dependency is using libstdc++ then I recommend removing $(inherited) from your target's linker flags. That will cause the linker to report missing symbols from the place that's using it, giving away which library has the problem.

Xcode product archive error

When I try to archive my project with Xcode I've got an error:
ld: library not found for -lReachability
clang: error: linker command failed with exit code 1
Can you help me how to fix that?
You need to set the path that Xcode use to find your Reachability framework.
Create your search path like this
$(PROJECT_DIR)/../yourFramework/lib
and add it in Build Settings-> Framework Search Paths for both debug and release builds.
You can get the exact path from Finder get info.
Check the reference links
Link
Link

iOS unit test with OCMock static library (the -ObjC flag issue)

My project is developed with Objective-C. I have a third party framework in use (I name it thirdparty here. Sorry, I can't tell the name of the third-party).
Now, I want to write unit test code for my project. I use OCMock static library & I followed its instruction to setup this static library to my iOS project. As you see in their instruction, it asks me to add the -ObjC linker flag in Build Settings -> Other Linker Flags.
But when I build my project I get the following error:
ld: warning: Auto-Linking supplied '../thirdparty.framework/thirdparty',
missing required architecture i386 in file ../thirdparty.framework/thirdparty (2 slices)
But, if I remove the added -ObjC linker flag from Build Settings -> Other Linker Flags, the above error disappears, my project then can be built successfully (but when run my unit test, OCMock library throws error which asks me to add the -ObjC linker flag back)
Regarding the error, I assume that your 3rd libs do not support i386 architecture. I guess that you experienced that issue when running on Simulator. You should check again whether or not your libs support the targeted architecture. Here is the script to check
xcrun -sdk iphoneos lipo -info $(FILENAME)
The result shows like this
So I think the issue might not come from OCMock static lib as long as it supports i386 architecture. You should check again your configuration or other libs as well.

Cannot Archive when a library is included in my own iOS custom framework

I created my own iOS framework by following this tutorial, https://code.google.com/p/ios-static-framework/, which uses a static library template and aggregate target with a custom run script to create a framework.
At first it works fine. After including another library in the framework project creates the error when archive or build for device. I think the problem is with some wrong settings for that library. But I just don't know what to try. I have tried setting some sensible Other Linker Flags from https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ld.1.html , but no luck. Can anyone help please ;(
What steps will reproduce the problem?
Follow the tutorial, but change the Aggregate script architecture from armv6 armv7 to armv7 armv7s. Here is the part of the aggregate target script I changed. Everything else is the same.
if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
SF_OTHER_PLATFORM=iphonesimulator
SF_ARCHS=i386
else
SF_OTHER_PLATFORM=iphoneos
SF_ARCHS="armv7 armv7s"
fi
Add an external library to the project, here I use libBlocksKit.a.
Build the framework, success.
In another child project. Include my built framework.
Add -ObjC in the app Target > Build Settings > Other Linker Flags
Archive and get error. Building for device (iPhone5) gives error too. But building for simulator seems to work.
What is the error?
This error, basically "ld: warning: directory not found for option ... ld: lto: could not merge in ... symbol multiply defined!".
ld: warning: directory not found for option '-L/Users/hlung/Dropbox/- Notes/stackoverflow/RealFrameworkApp/RealFrameworkApp/External/BlocksKit'
ld: lto: could not merge in /Users/hlung/Library/Developer/Xcode/DerivedData/RealFrameworkTest-evagqzwzyyolhjenkkjbvzibxppf/Build/Products/Debug-iphonesimulator/RealFrameworkTest.framework/RealFrameworkTest(NSObject+BlockObservation.o) because 'Linking globals named 'OBJC_CLASS_$_BKObserver': symbol multiply defined!', using libLTO version 'LLVM version 3.2svn, from Apple Clang 4.2 (build 425.0.28)' for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
If I archive my child project with only one architecture (like armv7), it works. It shows this error with armv7 armv7s architectures ( $(ARCHS_STANDARD_32_BIT) ).
What version of the product are you using? On what operating system?
OS X 10.8.5, XCode 4.6.3
== Update 1 ==
Posted an issue at the tutorial's code.google.com page Update: 2 weeks no answer.
I found a set of useful suggestions from this answer. Update: Doesn't work
I have created a project so you can run and see for yourself here
Linking against a static library from within a framework can create some interesting challenges... It sounds like you may be linking to BlocksKit from both your framework and your application projects.
You should link in only one of those places. Try removing libBlocksKit.a from the Link Libraries build phase of your framework, but leave it in the other project.
You can do like this:
Click on your project (targets)
Click on Build Settings
Under Library Search Paths, delete the paths
I hope it can help you.

Linker errors building iOS app with Simperium

I'm getting linker errors when integrating Simperium into my app:
ld: duplicate symbol _OBJC_CLASS_$_DDASLLogger in
/Users/zulfi_shah/Documents/ContactsJournal-TestSimperium/SimpleList/Simperium.framework/Simperium(DDASLLogger.o) and
/Users/zulfi_shah/Library/Developer/Xcode/DerivedData/SimpleList-cxdtxuubxyczhgcyxbixtjtvzkct/Build/Intermediates/SimpleList.build/Debug-iphonesimulator/SimpleList.build/Objects-normal/i386/DDASLLogger.o
for architecture i386 clang: error: linker command failed with exit
code 1 (use -v to see invocation)
The issue seems to be with DDASLLogger which is included in CocoaHTTP package. I also saw the same issue with Reachability classes before.
How do I ensure Simperium framework plays nice with other libraries in my binary?
Thanks.
We're updating the library on our end to avoid these name clashes. This should be fixed soon.
In the meantime, if you encounter this problem (with Simperium or any other library) you can remove your own versions of the conflicting library from your target. You can do this in a couple ways:
Select each corresponding file for the conflicting library, open the browser on the right, and uncheck the box next to your target name.
Select your Project, then your target, go to Build Phases | Compile Sources, and remove the source files for the conflicting library.
This is not very friendly, hence why we'll be fixing it soon.

Resources