我有一个简单的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不起作用,因为文件从未变成输出文件,尽管名称发生了变化,这里可能出现什么问题?
答案 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}
目标。