2015-03-12 1 views
0

Я в папке App моего проекта. Я выполнить следующую команду для компиляции character.cppГде находится путь -I (captial i) относительно g ++?

g++ -Wall -std=c++11 -I../App -c Character/character.cpp -o Obj/character.o 

, который находится в App/Character каталоге. character.cpp имеет следующие включают

#include "Inventory/inventory.hpp" 

где папка inventory.cpp является App/Inventory.

Я думал, что я бегу команду g++ от App, по умолчанию включают в себя путь будет начинаться с App, и поэтому я не должен был бы иметь -I../App часть команды. Для меня это, кажется, говорит: «Двигайтесь на один уровень выше, чем приложение, а затем переходите в приложение и включайте оттуда», что кажется излишним, но без этой строки оно не работает.

Может ли кто-нибудь объяснить, почему?

EDIT

Глядя на нее еще раз и еще некоторые документы, я считаю, что, если не указан -I пути, г ++ будет выглядеть в своих стандартных каталогах, а затем все остальные включают в себя (как тот, я вызываю проблемы) относятся к файлу, который их включает. Поэтому я должен добавить часть -I, чтобы сказать «заглянуть в каталог приложения тоже», и так как это не нравится только -I, я должен использовать ../App, потому что это эквивалентно не перемещению вообще. Может ли кто-нибудь подтвердить, насколько это точно?

ответ

1

Вы можете использовать -I. для поиска заголовков из текущего каталога, а не -I../App.

Это включает директиву препроцессора

#include "Inventory/inventory.hpp" 

силы GCC (г ++ или CPP), чтобы найти заголовок не из текущего пути (App/), но из директории вашего исходного файла (App/Character):

/root/App# strace -f g++ -c -H ./Character/character.cpp 2>&1 |grep Inven 
[pid 31316] read(3, "#include \"Inventory/inventory.hp"..., 35) = 35 
[pid 31316] stat64("./Character/Inventory/inventory.hpp.gch", 0xbfffe6a4) = -1 ENOENT (No such file or directory) 
[pid 31316] open("./Character/Inventory/inventory.hpp", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory) 
..then try system directories 

Это описано здесь: https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

НКУ Лоо кс для заголовков, запрашиваемых с #include «файл» первым в каталог, в котором текущий файл

Такое поведение может быть не фиксируется в языке стандарта (ISO C), и определяется реализацией (как прокомментировал Ричард Корден и ответил piCookie в What is the difference between #include <filename> and #include "filename"?):

указанная последовательность между «разделителями. Именованный исходный файл выполняется поисковым способом.

Но это способ, C компилятор должен работать под Unix, в соответствии с Posix, aka The Open Group Base Specifications Issue 7:

Таким образом, заголовки, имена которых заключены в двойные кавычки («») должен быть найден первый в каталог файла с линией #include, затем в каталогах, названных в параметрах -I, и последний в обычных местах. Для заголовков, имена которых заключены в угловые скобки («<>»), заголовок следует искать только в каталогах, названных в параметрах -I, а затем в обычных местах. Каталоги, названные в параметрах -I, должны быть найдены в указанном порядке.

Это полезно, если ваш текущий каталог находится далеко от исходного каталога (это рекомендуемый способ Autotools/AUTOCONF: сделать mkdir build_dir5;cd build_dir5; /path/to/original/source_dir/configure --options; then make - это не изменит исходный каталог и не будет генерировать много файлов в ней, вы может сделать несколько сборок с единственной копией источника).

При запуске г ++ из каталога App с -I. (или с -I../App или -I/full_path/to/App), GCC (г ++) будет найти Inventory. Я добавил предупреждение в заголовок, чтобы увидеть, когда он будет включен; и -H вариант gcc/g ++ печатает все включенные заголовки с исправлениями:

/root/App# cat Inventory/inventory.hpp 
#warning "Inventory/inventory.h included" 
/root/App# cat Character/character.cpp 
#include "Inventory/inventory.hpp" 
/root/App# g++ -I. ./Character/character.cpp -H -c 
. ./Inventory/inventory.hpp 
In file included from ./Character/character.cpp:1: 
./Inventory/inventory.hpp:1:2: warning: #warning "Inventory/inventory.h included"