在阅读scons的手册页时,我的理解是,scons并不总是意识到当头文件被更改时,cpp源文件也应该改变。我做了一个实验,但只是发现,无论我们是否指定了CPPPATH,似乎scons将始终检测头文件更改并应用相应源文件的重建。
例如,我有o.c文件和包含n.h文件的headers /目录:
#include"headers/n.h"
#include<stdio.h>
int main(){
printf("hello\n");
return 2;
}
我的sons SConstruct就像这样:
Program('o.c')
当我更改n.h的内容时,scons将重建o.c文件。这对我来说非常令人惊讶。我试着像这样改变SConscript:
Program('o.c',CPPPATH='.')
这一次,我希望scons只会检查“。”下的头文件,但不会检查./headers下的头文件。不过,scons将重建o.c
我将标题/移到了“。”上方的另一个地方。目录,并更改了o.c以包含绝对路径。当我更改n.h时,仍然会重建o.c
我的问题:
(1)scons如何扫描并确定头文件是否已更改,是否调用gcc前端或预处理器来执行此操作?如果是这样,它似乎与编译重复,对吧?
(2)我没有发现指定CPPPATH有用:是否指定,scons将扫描。即使我说CPPPATH =“。”,scons似乎也会扫描其他目录。
为什么呢?这是设计的吗?如果是,那么CPPPATH的用途是什么?
答案 0 :(得分:2)
再次(见Using 'LIBS' in scons 'Program' command failed to find static library, why?和When I change SConstruct file, scons doesn't trigger rebuild?)您的假设是错误的。
SCons只是模仿CPPPATH
编译器中gcc/g++
的用法。在上面的示例中,即使gcc
也会在命令行中找不到明确的“n.h
”标题-Iheaders
。通过你的明确
#include"headers/n.h"
它具有所需的所有信息(标题的完整相对/绝对路径)。把它变成
#include "n.h"
你会发现不同之处。