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

use*_*514 123 c gcc makefile

我有三个文件:program.c,program.hheaders.h.

program.c包括program.hheaders.h.

我需要使用gcc编译器在Linux上编译它.我不知道该怎么做.Netbeans为我创建了一个,但它是空的.

Joe*_*ams 187

有趣的是,我不知道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
Run Code Online (Sandbox Code Playgroud)

(请记住make需要tab而不是space indentation,所以一定要在复制时修复它)

但是,要支持更多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
Run Code Online (Sandbox Code Playgroud)

我试图通过省略通常在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)
Run Code Online (Sandbox Code Playgroud)

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

在任何一种情况下,请不要使用autoconf.我求你!:)

  • 为了在技术上正确,我相信你应该使用`.PHONY:clean all default`来为那些打算从命令行使用的目标.此外,Autoconf/Automake也不是那么糟糕.当然,他们觉得很糟糕,习惯他们就像强迫你的头穿过砖墙一样有趣,但他们确实有效,而且他们发育良好,他们将覆盖你的大部分基地,就便携性而言,一旦你习惯了糟糕的设计,最终会让你的生活变得更轻松. (6认同)
  • 如果有人想知道为什么在`rm`前面有破折号:/sf/ask/209262581/ (6认同)

Vil*_*iam 24

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

CC=gcc 
CFLAGS=-Wall

all: program
program: program.o
program.o: program.c program.h headers.h

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

注意<tab>清洁和运行后必须在下一行,而不是空格.

更新以下评论适用


ano*_*ous 14

all: program
program.o: program.h headers.h
Run Code Online (Sandbox Code Playgroud)

足够.其余的都是隐含的

  • 如果你的整个程序是一个单一的 `.c` 文件,那么只有 `program:` 是必要的。甜的 :) (2认同)

Ind*_*mar 10

最简单的make文件可以

all : test

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

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

clean :
        rm test *.o
Run Code Online (Sandbox Code Playgroud)

  • 您实际上可以简化很多。看到@匿名1班轮 (2认同)