对于我的一个类中的一个任务,我们需要为我们的C程序创建一个比compile: gcc whatever更复杂的Makefile.我相信我们应该做这样的事情:

outputname: file1.o file2.o file3.o file4.o
    gcc -o outputname file1.o file2.o file3.o file4.o

clean:
    rm -f outputname file1.o file2.o file3.o file4.o

file1.o: file1.c
    gcc -c file1.c

file2.o: file2.c
    gcc -c file2.c

file3.o: file3.c
    gcc -c file3.c

file4.o: file4.c
    gcc -c file4.c

但不得不多次列出相同的文件名让我感到恼火.如果我需要更新一个名称,我需要确保在文件中替换它的每个实例.或者,如果我添加一个文件,我必须添加与文件中已有的四个其他行几乎相同的新行.我已经设法接近了上述Makefile的功能:

files := file1.o file2.o file3.o file4.o
output := outputname

$(output): $(files)
    gcc -o $(output) $(files)

clean: 
    rm -f $(output) $(files)

$(files): $(files:.o=.c)
    gcc -c $(@:.o=.c)

我能说出的唯一区别是,与第一个示例不同的是,如果所有c文件中的任何一个已经更新,这将重新编译所有c文件,从而消除了Make文件的优势之一.我还能做些什么来go 掉冗余但保留所有功能吗?

推荐答案

大多数make个实用程序都有内置的隐式依赖项,比如从.c文件生成.o文件.因此,由于您没有在编译步骤中指定任何特殊内容,因此您可以将文件压缩为如下内容:

OBJS = file1.o file2.o file3.o file4.o

outputname: $(OBJS)
    gcc -o outputname $(OBJS)

...它可以自己处理剩下的事情(哦--除非你可能仍然想要你的clean:规则).

C++相关问答推荐

如何将匿名VLA分配给指针?

无效使用未定义类型'structsquare'?

DPDK-DumpCap不捕获端口上的传入数据包

正在try 将文件/文件夹名从目录 struct 存储到链接列表

减法运算结果的平方的最快方法?

如何使用低级C++写出数值

LibpCap禁用监视器模式(C、MacOS)

在编译时参数化类型定义

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

C语言中神秘的(我认为)缓冲区溢出

使用ld将目标文件链接到C标准库

如何使用空元素块声明指针数组

STM32 FATFS用户手册(Um1721)中的代码正确吗?

C中的空指针是什么(_N)?

解密Chrome加密密钥

将char*数组深度复制到 struct 中?

C循环条件内的函数

Struct 内的数组赋值

为什么写入关闭管道会返回成功

10 个字节对于这个 C 程序返回后跳行的能力有什么意义