对于我的一个类中的一个任务,我们需要为我们的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++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

来自stdarg.h的c中的va_args无法正常工作<>

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

为什么复合文字(C99)的返回会生成更多的汇编代码?

有没有更简单的方法从用户那里获取数据类型来计算结果

两个连续的语句是否按顺序排列?

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

空指针的运行时强制转换

为什么在此程序中必须使用Volatile关键字?

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

如何使解释器存储变量

如何在VSCode中创建和使用我自己的C库?

用C++构建和使用DLL的困惑

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

问题:C#Define上的初始值设定项元素不是常量

发送和接收的消息中的Unix域套接字不匹配

使用mmap为N整数分配内存

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

如何用用户输入的多个字符串填充数组?

将数组返回到链表