如何在Linux上为gcc创建简单的makefile?


Answers:


193

有趣的是,在给定有关源文件的规则的情况下,我不知道make将默认使用C编译器。

无论如何,一个演示简单Makefile概念的简单解决方案是:

HEADERS = program.h headers.h

default: program

program.o: program.c $(HEADERS)
    gcc -c program.c -o program.o

program: program.o
    gcc program.o -o program

clean:
    -rm -f program.o
    -rm -f program

(请记住,make需要使用制表符而不是空格缩进,因此在复制时一定要解决此问题)

但是,要支持更多的C文件,您必须为每个文件制定新规则。因此,要改善:

HEADERS = program.h headers.h
OBJECTS = program.o

default: program

%.o: %.c $(HEADERS)
    gcc -c $< -o $@

program: $(OBJECTS)
    gcc $(OBJECTS) -o $@

clean:
    -rm -f $(OBJECTS)
    -rm -f program

我试图通过省略通常在makefile文件中看到的$(CC)和$(CFLAGS)之类的变量来使其尽可能地简单。如果您有兴趣解决此问题,希望我给您一个良好的开端。

这是我喜欢用于C源代码的Makefile。随意使用它:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

它使用make实用程序的通配符和patsubst功能在当前目录中自动包括.c和.h文件,这意味着在将新代码文件添加到目录时,无需更新Makefile。但是,如果要更改生成的可执行文件,库或编译器标志的名称,则只需修改变量即可。

无论哪种情况,请不要使用autoconf。我求求你!:)


7
为了技术上正确,我相信您应该使用.PHONY: clean all default那些打算从命令行使用的目标。另外,Autoconf / Automake还不错。当然,他们感觉很糟糕,习惯他们就像把头顶在砖墙上一样有趣,但是它们确实起作用,而且发达,并且在便携性方面将覆盖您的大部分基础,一旦您习惯了他们糟糕的设计,最终将使您的生活变得更加轻松。
克里斯·卢茨

我想这可行,但是我想如果我在终端上键入“ make”,程序就应该运行。这就是我得到的:gcc statsh.o -Wall -lm -o prog是否可以仅键入make并执行程序?
user69514

您将在哪里添加openmp标志-fopenmp
MySchizoBuddy 2013年

1
为什么不使用autoconf joey-adams?
Michal Gonda

7
如果有人想知道为什么前面的破折号是rmstackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
Tor Klingberg,

25

例如,这个简单的Makefile就足够了:

CC = gcc 
CFLAGS =-墙

全部:程序
程序:program.o
program.o:program.c program.h headers.h

清洁:
    rm -f程序program.o
运行:程序
    。/程序

请注意<tab>,清洁并运行后,下一行必须有空格,不能有空格。

更新下面的注释已应用


@ user69514:make不带参数通常只会构建您的软件。要运行它,请使用make run(在此答案中可用,但不一定在所有Makefiles中可用),或直接运行它:./program
MestreLion 2015年

14
all: program
program.o: program.h headers.h

足够。其余的是隐式的


1
而且,如果您的整个程序是一个.c文件,则只program:需要一个。甜蜜:)
MestreLion 2015年

10

最简单的make文件可以是

all : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

clean :
        rm test *.o

您可以添加更多详细信息来解释Makefile的功能
Federico

2
您实际上可以简化很多。参见@anonymous 1班轮
Mark Lakata 2014年

0

根据标头的数量和您的开发习惯,您可能需要研究gccmakedep。该程序检查您的当前目录,并将每个.c / cpp文件的标头依赖项添加到makefile的末尾。当您有2个标头和一个程序文件时,这太过分了。但是,如果您有5个以上的小测试程序,并且正在编辑10个标头之一,则可以信任make来完全重建那些由于修改而更改的程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.