Как заставить g++ искать файлы заголовков в определенном каталоге?

у меня есть проект (Библиотека), который подразделяется на несколько директорий с кодом в них. Я хотел бы, чтобы G++ искал файлы заголовков в корневом каталоге проекта, поэтому я могу избежать разных путей включения для одних и тех же файлов заголовков в нескольких исходных файлах.

в основном root/ каталог имеет подкаталоги A/, B/ и C/, которые .hpp и .cpp файлы внутри. Если какой-то исходный файл в A хотел включить file.hpp, который был в B, он должен был бы сделать это так:#include "../B/file.hpp". То же самое для другого исходного файла, который был в C. Но, если у самого были подкаталоги с файлами, которые нуждались file.hpp, то это было бы непоследовательно и вызвало бы ошибки, если бы я решил переместить файлы (потому что путь включения будет "../../B/file.hpp").

кроме того, это должно работать и с другими проектами, которые находятся за пределами root/. Я уже знаю, что есть возможность вручную скопировать все мои файлы заголовков в поиск по умолчанию каталог, но я хотел бы сделать это так, как я описал.

Edit: все программы, использующие библиотеку, должны компилироваться только с помощью g++ prog.cpp lib.a -o prog. Это значит постоянно установка пути включения для g++!

4 ответов


A / code.cpp

#include <B/file.hpp>

a / a / code2.cpp

#include <B/file.hpp>

компиляция с использованием:

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

Edit:

вы можете использовать переменные среды для изменения пути g++ ищет заголовочные файлы. Из man page:

некоторые дополнительные переменные среды влияют на поведение препроцессор.

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH

значение каждой переменной-это список каталогов, разделенных специальным символом, похожим на PATH, в котором искать заголовок файлы. Специальный символ "PATH_SEPARATOR" зависит от цели и определяется во время сборки GCC. Для целей на базе Microsoft Windows является точкой с запятой, и почти для всех других целей это двоеточие.

CPATH задает список каталогов для поиска, как если бы он был указан с помощью-I, но после любых путей, заданных с помощью-I командная строка. Этот переменная окружения используется независимо от языка предварительно обрабатывать.

остальные переменные среды применяются только при предварительной обработке указанного языка. Каждый задает список каталогов поиск, как если бы указано с -isystem, но после любых путей, заданных с-iSystem параметры в командной строке.

во всех этих переменных пустой элемент указывает компилятору искать его текущий рабочий каталог. Пустые элементы могут появляются в начале или конец путь. Например, если значение CPATH": / special / include", это имеет тот же эффект, что и-I. - I / special / include.

есть много способов изменить переменную среды. В командной строке можно сделать так:

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

вы можете, конечно, добавить это в свой Makefile и т. д.


gcc -I/path -L/path
  • -I /path путь к ССЗ найдете .H-файлы по этому пути

  • -L /path содержащую файлы библиотек, .a, .so


заголовки, включенные в #include , будут искать во всех каталогах по умолчанию, но вы также можете добавить свое собственное местоположение в путь поиска с помощью-I командной строки arg.

Я видел ваше редактирование, вы можете установить свои заголовки в местах по умолчанию обычно

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

подтвердите с помощью документов компилятора.


Это просто, используйте опцию "- B", чтобы добавить .H-файлы' dir для поиска пути.

например. g++ - B / header_file.h ваш.cpp-o bin / your_command