How to set include path in xcode project

CXcodeIncludeEnvironment Variables

C Problem Overview


I am trying to use a C library in an Objective-C Xcode project.

The libraries directory structure is as follows:

-- include/
    |-- config.h
    |-- lib/
    |    |-- file1.h
    |    |-- file2.h
    |    |-- file3.h

The library's docs say to include file1.h, and file1.h includes file2.h and file3.h.

I am getting "file not found" errors for the includes of file2.h and file3.h`. They are included by file1.h in the following manner:

#include <lib/file1.h>
#include <lib/file2.h>

I read here that these angle-brackets instruct the preprocessor to search for include files along the path specified by the INCLUDE environment variable, as opposed to searching in the same directory as the file that contains the #include.

So I added the INCLUDE environment variable in Xcode by going to Product->Edit Scheme.. and set it to /the-whole-path-to/include/ however, I am still getting the file not found errors.

The files are successfully included if I change file1.h to include them like this:

#include "file2.h"

but I'd rather not do that for every file in the library.

How can I fix this?

C Solutions


Solution 1 - C

In version 5.0.2 of XCode, the best way to accomplish this is probably to add it to the target's "Search Paths" pane. Locating this was (for me) incredibly unintuitive. Here's how I got to it, for those as confused as I:

In the left column, click on the Project Navigator icon (looks like a folder). Then, click on the project entry. This should show a bunch of settings in the main pane. At the top of this pane, click on "Build Settings. This shows a bunch of entries... including one called Search Paths... but you can't add a search path here! This made me gnash my teeth for quite a while, until I figured out that the name of the project at the top of this pane was a pull-down; choose the target from this pull-down, and you should now be able to double click on "Header Search Paths" and perform the needed edit.

Oh, the joy of crazy GUIs.

Solution 2 - C

Figured it out.

All you have to do is add the -I flag to your build setting under "Other C Flags"

So in your target's build setting search for "Other C Flags" and add -I/path-to-include/

Here's a screenshot: enter image description here

Solution 3 - C

Try this:

1 - select your project file in the left Xcode pane
2 - make sure your project is selected in the middle Xcode pane
3 - select "Build Settings" at the top of the middle Xcode pane
4 - be sure "All" & "Combined" are selected just beneath "Build Settings"
5 - type header in the search field just below "Build Settings"

You should see the search path fields ready for editing in the middle pane.

Solution 4 - C

I solved this in Xcode 5.0.1 using the project Build Settings (as John and Ian noted above, but I cannot comment due to <50 rep).

New info:

When adding includes to User Header Search Paths, I also had to change Always Search User Paths to Yes.

When adding includes to (non-User) Header Search Paths, Always Search User Paths is not required.

Solution 5 - C

Although this works, it is probably better to put it under the "Search Paths" tab instead.

Solution 6 - C

Either you can use "Other C Flags" or use "HEADER_SEARCH_PATHS", to specify the include paths, to look for header for your executable.

Solution 7 - C

In 2021, Xcode v. 12.4, the solution seems to be:

Project->Targets->General->"Scan All Source Files For Includes"-> set to "Yes"

This worked for me.

However, this might backfire if you have multiple versions of a specific .h file, probably not a good practice but it's possible if you have lots of sub-directories with their own mini-projects and similarly named include files.

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
QuestionRyanMView Question on Stackoverflow
Solution 1 - CJohn ClementsView Answer on Stackoverflow
Solution 2 - CRyanMView Answer on Stackoverflow
Solution 3 - CrussesView Answer on Stackoverflow
Solution 4 - CMattView Answer on Stackoverflow
Solution 5 - CimallettView Answer on Stackoverflow
Solution 6 - CparasrishView Answer on Stackoverflow
Solution 7 - CBlisterpeanutsView Answer on Stackoverflow