gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:08:34 24 4
gpt4 key购买 nike

我有一个简单的 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 的颜色编码为蓝色。因此,当我查看目录时(在 Ubuntu 上运行 make 后), test.out 工作正常(它是绿色编码的,但 sort.out 不是(它是白色的)。尝试运行 ./sort.out 不起作用尽管名称发生了变化,但该文件从未变成输出文件,这里可能出了什么问题?

最佳答案

简单来说,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 中定义编译标志,宏中的加载器标志 LDFLAGSLDLIBS中的图书馆。它假设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}每个都是最新的,然后执行 all 的(空)命令列表目标。使${PROG1} ,它找到规则,确保依赖项是最新的,然后运行(非空)命令列表来创建 ${PROG1}目标。

关于c - 简单的 makefile 不生成输出文件(正确),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33597686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com