Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 使目标依赖于执行_Makefile_Gnu Make - Fatal编程技术网

Makefile 使目标依赖于执行

Makefile 使目标依赖于执行,makefile,gnu-make,Makefile,Gnu Make,我希望make目标依赖于执行文件。例如,我有一个简单的makefile: a.out: test.cpp gcc test.cpp 我想要这样的东西: a.out: test.cpp, `which gcc` gcc test.cpp 这意味着更改gcc(特别是更新)将导致重建a.out(即使test.cpp没有更改) 但它看起来像一个不成形的解决方案,因为您应该为该规则工具中使用的每个规则添加一个附加的先决条件 这个问题还有其他解决方案吗?在GNUmakemakefile中

我希望make目标依赖于执行文件。例如,我有一个简单的makefile:

a.out: test.cpp
    gcc test.cpp
我想要这样的东西:

a.out: test.cpp, `which gcc`
    gcc test.cpp
这意味着更改gcc(特别是更新)将导致重建a.out(即使test.cpp没有更改)

但它看起来像一个不成形的解决方案,因为您应该为该规则工具中使用的每个规则添加一个附加的先决条件


这个问题还有其他解决方案吗?

在GNU
make
makefile中,您可以使用:

CC := $(shell which gcc)

a.out: test.cpp ${CC}
    ${CC} -o $@ test.cpp

请注意,只有当编译器可执行文件被修改时,构建才会触发,而不仅仅是因为它与上次构建程序时不同。历史上,SUN
make
有一个“.make.state”文件和一个
.KEEP_state
目标,用于跟踪这些事情。IBM Rational ClearCase有一个
clearmake
,如果您选择这样做,它也会跟踪这些问题。

在GNU
make
make文件中,您可以使用:

CC := $(shell which gcc)

a.out: test.cpp ${CC}
    ${CC} -o $@ test.cpp

请注意,只有当编译器可执行文件被修改时,构建才会触发,而不仅仅是因为它与上次构建程序时不同。历史上,SUN
make
有一个“.make.state”文件和一个
.KEEP_state
目标,用于跟踪这些事情。IBM Rational ClearCase有一个
clearmake
,如果您选择这样做,它也会跟踪这些问题。

解决方案是,您通常知道何时更改
gcc
版本。这不是一个定期进行的更改,而是在开发过程中很少进行的更改。因此,用户知道,
gcc
发生了变化,他/她可以发出
make clean
命令,在下一次
make
上重建所有内容。另外,请注意,只有在您当前使用的gcc自上次生成程序以来已被修改的情况下,才会触发重新编译,不仅仅是因为它和你上次使用的程序不同。谢谢!我当然明白这一点,这正是我想要的。解决方案是,当您更改
gcc
版本时,您通常会知道。这不是一个定期进行的更改,而是在开发过程中很少进行的更改。因此,用户知道,
gcc
发生了变化,他/她可以发出
make clean
命令,在下一次
make
上重建所有内容。另外,请注意,只有在您当前使用的gcc自上次生成程序以来已被修改的情况下,才会触发重新编译,不仅仅是因为它和你上次使用的程序不同。谢谢!我当然理解,这是我真正想要的。