使用Makefile中的标志进行编译

时间:2011-05-03 14:28:00

标签: c gcc makefile

为了澄清事情,我们假设我正在使用3个文件prgmain.cperson.h编译程序(person.c)。

如果我使用简洁的方式编写makefile,就像这样(更具体地说是最后两行):

prg : main.o person.o
    gcc -Wall -o prg -c $^

main.o : person.h
person.o : person.h

-Wall会自动应用于main.operson.o吗?或者这甚至不重要?

我知道,正如文件所说,如果需要重新编译person.oprg也需要重新编译。但是,我不知道仅在主目标中指定-Wall是否足以启用其他目标,因此在编译其他目标时会发出警告。

也许我错过了一些非常重要的东西,或者我说的是没有意义的东西;但是放轻松,我只是一个初学者:P

2 个答案:

答案 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的显式行。

相关问题