читая справочную страницу scons, я понял, что scons не всегда понимает, когда изменяется заголовочный файл, исходные файлы cpp также должны меняться. Я провел эксперимент, но только для того, чтобы выяснить, определен ли у нас CPPPATH или нет, кажется, что scons всегда будет обнаруживать изменения в заголовочном файле и применяет пересборку соответствующих исходных файлов.
Например, у меня есть файл o.c и каталог headers /, содержащий файл n.h:
#include"headers/n.h"#include<stdio.h>
int main(){
printf("hello\n");
return 2;
}
И мои scons SConstruct таковы:
Program('o.c')
Когда я изменю содержимое n.h, scons перестроит файл o.c. Это довольно удивительно для меня. Я попытался изменить SConscript следующим образом:
Program('o.c',CPPPATH='.')
Надеюсь, на этот раз scons будет проверять только заголовочные файлы в «.», Но не в ./headers. Тем не менее, scons будет восстанавливать o.c
Я переместил заголовки / в другое место выше «.» каталог, и изменил o.c, чтобы включить его с абсолютным путем. Когда я изменяю n.h, все еще scons будет восстанавливать o.c
Мои вопросы:
(1) Как скан сканирует и определяет, изменился ли заголовочный файл, вызывает ли он gcc front-end или препроцессор для этого? Если так, то, похоже, дублируется работа с компиляцией, верно?
(2) Я не нахожу полезным указание CPPPATH: будут ли сканироваться сканоны. Даже когда я говорю CPPPATH = «.», Scons, кажется, сканирует другие каталоги.
Зачем? Это по замыслу? Если да, то как вообще используется CPPPATH?
Опять (см. При использовании команды «LIBS» в программе scons «Program» не удалось найти статическую библиотеку. Почему? а также Когда я изменяю файл SConstruct, scons не вызывает перестроение?Ваши предположения неверны.
SCons просто имитирует использование CPPPATH
как в gcc/g++
компилятор. В вашем примере выше, даже gcc
найдет заголовок n.h
без явного-Iheaders
«в командной строке.
#include"headers/n.h"
у него есть вся необходимая информация (полный относительный / абсолютный путь к заголовку). Сделать это
#include "n.h"
и вы увидите разницу.
Других решений пока нет …