代码之家  ›  专栏  ›  技术社区  ›  Frostbiyt

C Makefile-如何避免重复提及文件名

  •  0
  • Frostbiyt  · 技术社区  · 2 年前

    对于我的一个类中的作业,我们需要为C程序创建一个makefile,它比 compile: gcc whatever 。我相信我们应该这样做:

    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文件,从而消除makefile的优势之一。我还能做些什么来消除冗余,但保留所有功能吗?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Jerry Coffin    2 年前

    make 对于从.c文件生成.o文件之类的事情,实用程序已经有了内置的隐式依赖关系。因此,由于在编译步骤中没有指定任何特殊内容,因此可以将文件压缩为以下内容:

    OBJS = file1.o file2.o file3.o file4.o
    
    outputname: $(OBJS)
        gcc -o outputname $(OBJS)
    

    …它可以自己处理剩下的(哦——除了你可能仍然想要你的 clean: 规则)。