2016-10-04 257 views
0

在阅读scons的手册页时,我的理解是,scons并不总是在头文件发生变化时才意识到,cpp源文件也应该改变。我做了一个实验,但只是为了找到,无论我们是否指定了CPPPATH,似乎scons总是会检测到头文件更改并应用重建相应的源文件。CPPPATH似乎不适用于scons?

举例来说,我已经有了OC文件和头文件/目录包含NH文件:

#include"headers/n.h" 
#include<stdio.h> 
int main(){ 
    printf("hello\n"); 
    return 2; 
} 

而且我scons的SConstruct是这样的:

Program('o.c') 

当我改变NH内容,scons将重建oc文件。这对我来说很令人惊讶。我试图改变SConscript这样的:

Program('o.c',CPPPATH='.') 

这一次,我希望scons的将只检查在头文件,而不是下./headers“”。不过,scons会重建o.c

我将标题/移动到“。”上方的另一个地方。目录,并将o.c更改为包含绝对路径。当我改变NH,仍然使用SCons将重建OC

我的问题:

(1)如何scons的扫描,并确定头文件发生了变化,它调用gcc的前端或预处理器要做到这一点?如果是这样,它似乎与编译重复,对吧?

(2)我没有发现指定CPPPATH有用:是否指定,scons将扫描。即使当我说CPPPATH =“。”,scons似乎扫描其他目录。

为什么?这是设计吗?如果是,那么CPPPATH的用法是什么?

+1

请每个问题提出一个问题。 –

+1

+1“仅限一个问题”...并且请停止声明“SCons似乎不工作”。你可以这么说:“SCons不像预期的那样行事。”但是这应该包括对文档的参考,并且最好是一个“最小工作示例”,以清楚地表明偏差。简单地说,SCons的行为与你期望的不同,然后问“为什么”这个问题,对其他用户可能不是很有帮助。 – dirkbaechle

回答

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也会在命令行中找到没有明确的“-Iheaders”的标头n.h。通过你的明确的

#include"headers/n.h" 

它具有它需要的所有信息(标头的完整相对/绝对路径)。做一个

#include "n.h" 

你会看到一个区别。

相关问题