简单的makefile不生成输出文件(正确)

时间:2015-11-08 18:50:38

标签: c compiler-errors makefile

我有一个简单的make文件:

all:
    gcc -ansi -pedantic -Wall -Werror ListImplementation.c ListType.h ListInterface.h  test.c -o test.out

    gcc -ansi -pedantic -Wall -Werror ListImplementation.c ListType.h ListInterface.h  sort.c -o sort.out

其中test.c是依赖于其他c文件和头文件的文件。 sort.c也是如此。

现在输入" make"它编译,但在我的文本编辑器(gedit)中, 由于某种原因,sort.c的颜色为蓝色。因此当我查看目录(运行make后在On Ubuntu上)时,test.out工作正常(它的绿色编码,但sort.out没有(它是白色)。试图运行。 /sort.out不起作用,因为文件从未变成输出文件,尽管名称发生了变化,这里可能出现什么问题?

1 个答案:

答案 0 :(得分:0)

简洁地说,makefile的整个结构是错误的。对于显示的代码,您应该使用类似的内容:

PROG1 = test
PROG2 = sort
PROGRAMS = ${PROG1} ${PROG2}

LIST.c = ListImplementation.c
TEST.c = test.c
SORT.c = sort.c

LIST.o = ${LIST.c:.c=.o}
SORT.o = ${SORT.c:.c=.o}
TEST.o = ${TEST.c:.c=.o}

all: ${PROG1} ${PROG2}

${PROG1}: ${LIST.o} ${TEST.o}
    ${CC} -o $@ ${CFLAGS} ${LIST.o} ${TEST.o} ${LDFLAGS} ${LDLIBS}

${PROG2}: ${LIST.o} ${SORT.o}
    ${CC} -o $@ ${CFLAGS} ${LIST.o} ${SORT.o} ${LDFLAGS} ${LDLIBS}

${LIST.o}: ListType.h ListInterface.h
${SORT.o}: ListType.h ListInterface.h
${TEST.o}: ListType.h ListInterface.h

这适用于几乎任何版本的make。它假定make程序将在宏CC中定义C编译器,它定义宏CFLAGS中的编译标志,宏LDFLAGS中的加载器标志和{LDLIBS中的库。 1}}。它假定make可以推断出它可以使用相当于的内置规则从sort.o创建sort.c

sort.o: sort.c
    ${CC} ${CFLAGS} -c -o $@ sort.c

其中可能未在命令行中指定-o $@

如果您正在使用GNU make,则会有一些未使用的短序。通常,我为程序的目标文件定义一个宏,然后在依赖项列表和链接器命令行中使用它。此外,使用GNU make,您可以有用地添加:

.PHONY: all

告诉make不应该是名为all的实际文件。

现在,当您运行make时,它会查找all。当它找不到它时,它通过确保依赖项${PROG1}${PROG2}各自是最新的,然后执行{{1}的(空)命令列表来实现它。目标。要创建all,它会找到规则,确保依赖项是最新的,然后运行(非空)命令列表以创建${PROG1}目标。