CPPPATH似乎不适用于scons?

时间:2016-10-04 15:26:03

标签: c++ linux include scons rebuild

在阅读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的用途是什么?

1 个答案:

答案 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"

你会发现不同之处。