2013-07-04 6 views
2

Некоторые файлы заголовков присутствуют в /src/dir1/ (например: a.h, b.h, c.h и т. Д.). Мой исходный файл присутствует в /src/dir2/file.cpp. Я использовал некоторые файлы заголовков, которые присутствуют в /src/dir1/, но во время компиляции я получил ошибки, такие как header file not found.c/C++: файл заголовка не найден

Затем я изменил путь включает как #include "../src/dir1/a.h", то ошибка исчезает в file.cpp, но я получаю ошибку not found в заголовках файлов, которые присутствуют в /src/dir1. Потому что я включил файл заголовка a.h, что a.h включил некоторые другие файлы заголовков, которые присутствуют в /src/dir1/ (скажем b.h и c.h присутствует в a.h).

Как добавить файл заголовка (a.h) в /src/dir2/file.cpp, чтобы он не просил изменить путь включения в файлах заголовков, которые присутствуют в /src/dir1/?

Примечание: Я использую scons для сборки.

+2

Вам нужно будет либо «включить» ../dir1/a.h »или« #include »../ .. src/dir1/a.h", чтобы найти файл.Но вложение '..' в include paths - это плохая идея (как используется абсолютный путь). Используйте «#include» a.h »или« #include »dir1/a.h» и соответствующую опцию командной строки «-I» при компиляции. –

ответ

3

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

gcc -I/src/dir1 file.cpp 
+0

Это специфический для gcc SCons работает для множества компиляторов. – LogicG8

+1

Опция '-I' требуется POSIX; 'gcc' реализует его. Я не знаю компилятора, где он не поддерживается - AFAIK, даже MSVC поддерживает '-I' (возможно, как'/I'). –

2

SCons FAQ:

Как получить SCons, чтобы найти мои #include файлы?

Если ваша программа имеет #include файлы в разных каталогах, необходимо каким-то образом сообщить SCons, в каких каталогах она должна искать файлы #include. Вы можете сделать это, установив переменную CPPPATH в список каталогов, которые содержат .h файлы, которые вы хотите искать:

env = Environment(CPPPATH='inc') 
env.Program('foo', 'foo.c') 

SCons добавит в командную строку компиляции (ы) с правой -I опций, или любые аналогичные параметры подходят для компилятора C или C++, который вы используете. Это делает вашу конфигурацию конфигурации на основе SCons.

Примечание конкретно, что вы не должны установить включать каталоги непосредственно в переменной CCFLAGS, как вы могли бы первоначально ожидать:

env = Environment(CCFLAGS='-Iinc') # THIS IS INCORRECT! 
env.Program('foo', 'foo.c') 

Это делает программу компиляции правильно, но SCons не найти зависимости в Подкаталог «inc», и программа не будет восстановлена, если какой-либо из этих файлов #include изменится.

3

Это не найдено, потому что его там нет. У вас есть один дополнительный уровень косвенности. Файл в файле «/ src/foo /» будет содержать файл в «/ src/bar /» с «include ../bar/the_file»

Другими словами, в вашем примере нет «../src/"относительно dir1 или dir2. Отношение «dir1 /../ dir2» или «dir1 /../../ src/dir2»

Чтобы увидеть это сами, сделайте dir1 в своем текущем каталоге (chdir/src/dir1) и сравните разница между «ls ..» и «ls ../src». Второй ls не будет работать, но первый будет.

Имеют смысл? надеюсь, что поможет

Смежные вопросы