首页 > 代码库 > 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)表示把生成的文件强制变成可执行文件