首页 > 代码库 > c makefile
c makefile
程序:print.c print.h main.c
print.h
#include<stdio.h> void printhello();
print.c
#include"print.h" void printhello(){ printf("Hello, world\n"); }
main.c
#include "print.h" int main(){ printhello(); return 0; }
现在我们来写makefile
程序运行需要编译和链接,为每一个 *.c文件生成 *o文件,链接每一个*o文件,生成可执行文件。
#target : prerequisites
command//任意的shell 命令,前面有tab
makefile1
main:main.o print.o gcc main.o print.o -o main print.o:print.c print.h gcc -c print.c -o print.o main.o:main.c print.h gcc -c main.c -o main.o clean: rm main main.o print.o
makefile2
object = main.o print.o main:$(object) gcc $(object) -o main print.o:print.c print.h gcc -c print.c -o print.o main.o:main.c print.h gcc -c main.c -o main.o clean: rm main $(object)
声明字符串
makefile3
object = main.o print.o main:$(object) gcc $(object) -o main && ./main $(object):print.h print.o:print.c main.o:main.c clean: rm main $(object)
省略了 gcc -c print.c -o print.o 和 gcc -c main.c -o main.o,让make去猜测
makefile4
object = main.o print.o CC=gcc CFLAGS = -Wall -O -g main:$(object) $(CC) $(object) -o main print.o:print.c print.h $(CC) $(CFLAGS) -c print.c -o print.o main.o:main.c print.h $(CC) $(CFLAGS) -c main.c -o main.o clean: rm main $(object)
CFLAGS = -Wall -O –g,解释一下。这是配置编译器设置,并把它赋值给CFFLAGS变量。
-Wall: 输出所有的警告信息。
-O: 在编译时进行优化。
-g: 表示编译debug版本。
如果要编译cpp文件,只要把gcc改成g++就行了
makefile5
现在我还想做出一个比较通用的makefile,不用一个个写源文件
CC = gcc XX = g++ CFLAGS = -Wall -O TARGET = ./main %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ %.o:%.cpp $(XX) $(CFLAGS) -c $< -o $@ SOURCES = $(wildcard *.c *.cpp) OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES))) $(TARGET):$(OBJS) $(XX) $(OBJS) -o $(TARGET) chmod a+x $(TARGET) clean: rm -rf *.o main
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o:%.cpp
$(XX) $(CFLAGS) -c $< -o $@
这几句命令表示把所有的.c,.cpp编译成.o文件,$@ 扩展成当前规则的目的文件名,对应%.o,$< 扩展成依靠,对应%.c
SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中
chmod a+x $(TARGET)表示把生成的文件强制变成可执行文件