Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

А/code.cpp

#include <B/file.hpp>

А/а/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++ ищет файлы заголовков. На странице руководства:

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

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH

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

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

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

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

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

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

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

Ответ 2

gcc -I/path -L/path
  • -I /path путь для включения, gcc найдет файлы .h в этом пути

  • -L /path содержит файлы библиотеки, .a, .s o

Ответ 3

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

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

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

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

Ответ 4

это просто, используйте параметр "-B", чтобы добавить путь .h files к пути поиска.

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