Linking a static library to an iOS project in Xcode 4

IphoneObjective CIosXcode4

Iphone Problem Overview


I have a project (AQGridView) that compiles to a static library, but I can't seem to add it to my project.

Dragging in the project to my project creates a workspace, and if I try to link the libAQGridView.a file from the DerivedData directory it doesn't recognize it as a library. I'm not sure what I'm doing wrong.

This is the AQGridView project. Does anyone know specifically how to use it in an Xcode 4 project?

Iphone Solutions


Solution 1 - Iphone

I do this as follows:

  1. Drag in the static library project. If you have the static library project open in Xcode, close it now.
  2. Select the main project in the project navigator (the project I'm adding the static library to) and in the editor, under the header TARGETS in the left-hand column, select my main project's target and navigate to the Build Phases tab.
  3. Click the "+" for Target Dependencies and add the library icon target dependency from the added static library project.
  4. Click the "+" for Link Binary with Libraries and add the library icon that is under the folder "Workspace".
  5. It may also be necessary to enter a Header Search Path for the headers of the static library project if that is how the headers are linked in the static library project itself.

If you don't see the static library project as nested under the main project in the main project's project navigator, the most likely reason for that is that the static library's own Xcode project is still open. Quit Xcode and open up the main project that has the nested static library project in it without opening up the original static library project itself, and you should see it appearing as a nested project in your main project.

Solution 2 - Iphone

Xcode menu > View > Utilities > File Inspector

Select the static library file, and then set 'File Type' as 'Mach-O object code' in 'Identity and Type'.

Solution 3 - Iphone

Find your .a file in finder, and drag it into your project.

Select the 'copy items into destination group's folder (if needed)', and add your headers to your project.

Now, Xcode 4 should automatically link against that framework for you.

Here is what the library should look like in your project:

Solution 4 - Iphone

Workspaces are supposed to make this easier, but I don't know that they do. The way I do it is create a workspace, add my main project, add my library project. Then go into the main project's build phases and add the library in the "Link binary with libraries" section and add the library. That should be all that is necessary, at least that's my reading, but it isn't. What I do is go into Xcode preferences, then to the Source Trees pane. Add a source tree that points to your static library's headers, then go back to the build settings for your project, then to the Header Search Paths key, and enter ${foo} there, where "foo" is whatever you called the source tree.

That's what works for me, though I don't know if that's the best or easiest way to do it.

Solution 5 - Iphone

Follow Apple's documentation.

In brief:

  1. Link your target against the library.
  2. Add -ObjC to 'Other Linker Flags' (OTHER_LDFLAGS) under the target's build settings.

Also, I needed to add the library to the scheme of my main project since the library was not visible in the target's dependencies.

Solution 6 - Iphone

The Halle's answer works for me with one addition:

  1. Check in Build Settings of the static library project the Private( or Public) Headers Folder Path value and copy it.
  2. Add copied value to the client project Build Settings Header Search Path or User Header Search Path depending of the include directive you are using

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMatt HudsonView Question on Stackoverflow
Solution 1 - IphoneHalleView Answer on Stackoverflow
Solution 2 - IphoneKazuki SakamotoView Answer on Stackoverflow
Solution 3 - IphoneRichard J. Ross IIIView Answer on Stackoverflow
Solution 4 - IphoneJoey GibsonView Answer on Stackoverflow
Solution 5 - IphoneCorinView Answer on Stackoverflow
Solution 6 - IphoneIZIordanovView Answer on Stackoverflow