Jak sprawić, by g++ szukał plików nagłówkowych w określonym katalogu?

Mam projekt (bibliotekę), który jest podzielony na kilka katalogów z kodem w nich. Chciałbym, aby g++ szukał plików nagłówkowych w katalogu głównym projektu, więc mogę uniknąć różnych ścieżek dołączania dla tych samych plików nagłówkowych w wielu plikach źródłowych.

Głównie katalog root/ posiada podkatalogi A/, B/ i C/, z których wszystkie mają .hpp i .cpp pliki w środku. Jeśli jakiś plik źródłowy w A chciał dołączyć file.hpp, który był w B, musiałby to zrobić tak to: #include "../B/file.hpp". To samo dotyczy innego pliku źródłowego, który był w C. Ale jeśli sam a miał podkatalogi z plikami, które wymagały file.hpp, to byłby niespójny i powodowałby błędy, gdybym zdecydował się przenieść pliki(ponieważ ścieżka dołączania byłaby "../../B/file.hpp").

Musiałoby to również działać z innych projektów, które znajdują się poza root/. Wiem już, że istnieje możliwość ręcznego skopiowania wszystkich plików nagłówkowych do domyślnego katalogu wyszukiwania, ale chciałbym to zrobić w ten sposób opisane.

Edit: Wszystkie programy korzystające z biblioteki muszą kompilować się tylko z g++ prog.cpp lib.a -o prog. Oznacza to stałe ustawianie ścieżki include dla g++!

Author: Jean-Baptiste Yunès, 2012-09-29

4 answers

A / kod.cpp

#include <B/file.hpp>

A / A / code2.cpp

#include <B/file.hpp>

Kompiluj używając:

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

Edit:

Możesz użyć zmiennych środowiskowych, aby zmienić ścieżkę wyszukiwania plików nagłówkowych przez g++. Ze strony man:

Niektóre dodatkowe zmienne środowiska wpływają na zachowanie preprocesor.

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH

Wartość każdej zmiennej jest listą katalogów oddzielonych znakiem specjalnym, podobnie jak PATH, w których można szukać nagłówka pliki. Znak specjalny, "PATH_SEPARATOR", jest zależny od celu i określony w czasie budowania GCC. Dla celów Microsoft Windows To jest średnikiem, a dla prawie wszystkich innych celów jest dwukropkiem.

CPATH określa listę katalogów, które mają być przeszukiwane tak, jakby podano za pomocą-I, ale po ścieżkach podanych za pomocą opcji-I na wiersz poleceń. To zmienna środowiskowa jest używana niezależnie od tego, który język jest wstępnie przetwarzany.

Pozostałe zmienne środowiskowe mają zastosowanie tylko podczas wstępnego przetwarzania określonego języka. Każdy z nich określa lista katalogów, które mają być przeszukiwane tak, jakby podano za pomocą opcji-isystem, ale po ścieżkach podanych za pomocą opcji-isystem w wierszu poleceń.

We wszystkich tych zmiennych, pusty element nakazuje kompilatorowi przeszukiwanie bieżącego katalogu roboczego. Puste elementy mogą pojawiają się na początku albo koniec ścieżki. Na przykład, jeśli wartością CPATH jest": / special / include", to ma to samo efekt as-I. - I / special / include.

Istnieje wiele sposobów na zmianę zmiennej środowiskowej. W pytaniu bash możesz to zrobić:

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

Możesz oczywiście dodać to w swoim Makefile itp.

 38
Author: Vikas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-29 15:59:14
gcc -I/path -L/path
  • -I /path ścieżka do włączenia, gcc znajdzie .pliki h w tej ścieżce

  • -L /path zawiera pliki biblioteczne, .a, .so

 15
Author: Yueyoum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 05:10:11

Nagłówki zawarte w #include będą przeszukiwane we wszystkich katalogach domyślnych, ale możesz również dodać własną lokalizację w ścieżce wyszukiwania za pomocą arg linii poleceń-I.

Widziałem Twoją edycję możesz instalować nagłówki w domyślnych lokalizacjach zazwyczaj

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

Potwierdź za pomocą dokumentów kompilatora.

 0
Author: NiladriBose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-29 15:38:35

To proste, użyj opcji "- B", aby dodać .katalog plików h do ścieżki wyszukiwania.

Np. g++ - B / header_file.h Twój.cpp-o bin / your_command

 0
Author: Zhile Zou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-23 23:50:33