为了澄清事情,我们假设我正在使用3个文件prg
,main.c
和person.h
编译程序(person.c
)。
如果我使用简洁的方式编写makefile,就像这样(更具体地说是最后两行):
prg : main.o person.o
gcc -Wall -o prg -c $^
main.o : person.h
person.o : person.h
-Wall
会自动应用于main.o
和person.o
吗?或者这甚至不重要?
我知道,正如文件所说,如果需要重新编译person.o
,prg
也需要重新编译。但是,我不知道仅在主目标中指定-Wall
是否足以启用其他目标,因此在编译其他目标时会发出警告。
也许我错过了一些非常重要的东西,或者我说的是没有意义的东西;但是放轻松,我只是一个初学者:P
答案 0 :(得分:7)
由于您将-Wall
应用于链接阶段(将目标文件收集到可执行文件中),但该选项适用于编译阶段(将源文件转换为目标文件),因此它不会带来任何好处它是写的。
您应该通过设置宏来修改编译。
通常,将C源文件编译为目标文件的规则如下所示:
${CC} ${CFLAGS} -c $*.c
其中可能还有其他位,并且符号可能使用$*.c
之外的其他内容来标识源文件 - 有类似的(大致相当的)方法来指定它,但它与I点相切正在制作。 $(CC)
表示法也相当于${CC}
。
因此,要更改编译器,指定“CC=new_c_compiler
”并更改为编译选项,您(谨慎地)指定“CFLAGS=-Wall
”。
这可以在makefile或命令行中完成。命令行会覆盖makefile。
因此:
CFLAGS = -Wall
prg : main.o person.o
${CC} ${CFLAGS} -o prg -c $^
main.o : person.h
person.o : person.h
为什么要谨慎?因为在更复杂的情况下,可能存在一个复杂的CFLAGS定义,它可以从多个来源构建它,并且轻率地设置CFLAGS = -Wall
可能会丢失您的包含路径,宏定义和各种类型。在您的情况下,看起来您可以简单地设置它。
如果您使用GNU Make,只需将-Wall
添加到CFLAGS
:
CFLAGS += -Wall
这并不一定适用于make
的所有种类。
您的链接最终可能还需要收集一些与库相关的选项。
答案 1 :(得分:6)
不,这些标志不会神奇地应用于其他目标。
将这样的行添加到Makefile的顶部,高于规则:
CFLAGS=-Wall
然后尝试没有prg
的显式行。