Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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:如果存在c文件,则生成对象文件_C_Makefile - Fatal编程技术网

makefile:如果存在c文件,则生成对象文件

makefile:如果存在c文件,则生成对象文件,c,makefile,C,Makefile,我有一个使用编译器标志的c文件。当编译器标志更改时,我强制c文件在makefile写入中更新其值: compilerflagChange: FORCE echo ${CFLAGS} | cmp -s - $@ || echo ${CFLAGS} > $@ myCFile.o: compilerflagChange 除了我清理整个项目然后运行时,这项工作非常好。 在这种情况下,myCFile.C在进入语句之前没有生成 myCFile.o: compilerflagChange

我有一个使用编译器标志的c文件。当编译器标志更改时,我强制c文件在makefile写入中更新其值:

compilerflagChange: FORCE
    echo ${CFLAGS} | cmp -s - $@ || echo ${CFLAGS} > $@

myCFile.o: compilerflagChange
除了我清理整个项目然后运行时,这项工作非常好。 在这种情况下,myCFile.C在进入语句之前没有生成

myCFile.o: compilerflagChange
这将导致生成崩溃,错误为“MyCfile.C,没有这样的文件”

问题:如何根据C文件是否存在来制定规则?如果文件存在+cflagChange,请更新该文件,否则为nothing

更多信息:
“为什么不在每次生成myCFile.c之后重新构建myCFile.o?”makefile中没有合适的位置。为此,我需要向下走一些层,并失去重建它的原因的可追踪性。

make条件如何

ifneq ($(wildcard MyCfile.C),)
myCFile.o: compilerflagChange
endif

注意:您对字母大小写的使用非常不寻常(
myCFile.o
vs.
myCFile.C
)。我知道最流行的操作系统是不区分大小写的,但是你应该认真考虑更一致的拼写方案。可移植性,特别是在免费的情况下,是一件好事。

编译器标志是什么,jw?不重要吗?variable=readAValueFromCmdInput CFLAGS+=-DVARIABLE=“\”${variable}\C文件为什么不存在?它是通过预处理创建的吗?这个设置有点奇怪,但我无法理解你在做什么(或试图做什么)。如果源代码更改或编译器选项更改,是否正在尝试重新生成
myCFile.o
?但是源代码并不总是存在,但是如果目标文件确实存在,它应该被视为最新的,不需要重新编译?可能
myCFile.o
规则可能需要显式依赖于
myCFile.c
,并且需要是一个规则,以确保
myCFile.c
已创建且是最新的,但我缺少一些内容。如果
myCFile.c
不存在,您想做什么?清理项目后:1。如果compilerflags已更改(也检测第一次构建为更改),则myCFile.c将使用新值更新2。“构建开始”-一些对象文件是从c文件3生成的。“正在构建”-生成一些c文件(包括MyCFile.c)4。“正在构建”-在步骤3中从c文件生成更多的对象文件。如果我在没有清理的情况下运行构建,则不会执行步骤3。第4步是使用已经存在的文件,其中的值需要根据编译器标志进行更改。