我有三个文件:program.c,program.h和headers.h.
program.c包括program.h和headers.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.我求你!:)
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)
足够.其余的都是隐含的
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)