How to make g++ search for header files in a specific directory?

DirectoryG++Header FilesInclude Path

Directory Problem Overview


I have a project (a library) that is subdivided into a few directories with code in them. I'd like to to have g++ search for header files in the project's root directory, so I can avoid different include paths for same header files across multiple source files.

Mainly, the root/ directory has sub-directories A/, B/ and C/, all of which have .hpp and .cpp files inside. If some source file in A wanted to include file.hpp, which was in B, it would have to do it like this: #include "../B/file.hpp". Same for another source file that was in C. But, if A itself had sub-directories with files that needed file.hpp, then, it would be inconsistent and would cause errors if I decided to move files (because the include path would be "../../B/file.hpp").

Also, this would need to work from other projects as well, which reside outside of root/. I already know that there is an option to manually copy all my header files into a default-search directory, but I'd like to do this the way I described.

Edit: all programs using the library must compile only with g++ prog.cpp lib.a -o prog. That means permanently setting the include path for g++!

Directory Solutions


Solution 1 - Directory

A/code.cpp

#include <B/file.hpp>

A/a/code2.cpp

#include <B/file.hpp>

Compile using:

g++ -I /your/source/root /your/source/root/A/code.cpp
g++ -I /your/source/root /your/source/root/A/a/code2.cpp

Edit:

You can use environment variables to change the path g++ looks for header files. From man page:

> Some additional environments variables affect the behavior of the > preprocessor. > > CPATH > C_INCLUDE_PATH > CPLUS_INCLUDE_PATH > OBJC_INCLUDE_PATH > > Each variable's value is a list of directories separated by a special character, much like PATH, in which to look for header > files. The special character, "PATH_SEPARATOR", is target-dependent and determined at GCC build time. For Microsoft Windows-based targets it > is a semicolon, and for almost all other targets it is a colon. > > CPATH specifies a list of directories to be searched as if specified with -I, but after any paths given with -I options on the > command line. This > environment variable is used regardless of which language is being preprocessed. > > The remaining environment variables apply only when preprocessing the particular language indicated. Each specifies a > list of directories to be > searched as if specified with -isystem, but after any paths given with -isystem options on the command line. > > In all these variables, an empty element instructs the compiler to search its current working directory. Empty elements can > appear at the beginning > or end of a path. For instance, if the value of CPATH is ":/special/include", that has the same effect as -I. > -I/special/include.

There are many ways you can change an environment variable. On bash prompt you can do this:

$ export CPATH=/your/source/root
$ g++ /your/source/root/A/code.cpp
$ g++ /your/source/root/A/a/code2.cpp

You can of course add this in your Makefile etc.

Solution 2 - Directory

gcc -I/path -L/path
  • -I /path path to include, gcc will find .h files in this path

  • -L /path contains library files, .a, .so

Solution 3 - Directory

it's simple, use the "-B" option to add .h files' dir to search path.

E.g. g++ -B /header_file.h your.cpp -o bin/your_command

Solution 4 - Directory

Headers included with #include <> will be searched in all default directories , but you can also add your own location in the search path with -I command line arg.

I saw your edit you could install your headers in default locations usually

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

Confirm with compiler docs though.

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
QuestioncorazzaView Question on Stackoverflow
Solution 1 - DirectoryVikasView Answer on Stackoverflow
Solution 2 - DirectoryYueyoumView Answer on Stackoverflow
Solution 3 - DirectoryZhile ZouView Answer on Stackoverflow
Solution 4 - DirectoryNiladriBoseView Answer on Stackoverflow