在含有多个.c源文件的工程中,可以通过编写makefile来进行工程管理
makefile在工程目录下一般起名为"makefile"或"Makefile"
本makefile适用于大学阶段遇到的工程(也就是说大学阶段用这个makefile基本就够了)
# 通用型makefile
# 利用bash命令 找到当前目录下的所有的.c文件,
# 再存放到变量CSOURCE中
CSOURCE=${shell find . -name "*.c"}
# 如果有其他路径下的.c文件 还可以 用 CSOURCE+= 来添加
# 文本替换
# 将变量COBJ中的.c文本替换为.o文本
OBJ=$(CSOURCE:.c=.o)
# 将编译参数存放到变量CFLAG中,
# 如果还有其他的头文件路径,可以用 CFLAGS+= 来添加
# 编译参数有:显示所有警告,包含的头文件路径
CFLAGS=-Wall -I./
# 将要生成的工程的名字放到变量BIN中
# 编译指令: make project 或 make ./project
BIN=./project
# 将编译器的名字放到变量CC中
# Linux / windows 用的是: gcc
# 嵌入式arm平台用的是: arm-linux-gcc
CC=gcc
pri:
@echo $(CSOURCE)
@echo $(OBJ)
$(BIN):$(OBJ)
$(CC) $^ -o $@ $(CFLAGS)
%.o:%.c
$(CC) $^ -o $@ -c $(CFLAGS)
# 定义伪目标 clean
# 如果当前目录下有"clean"这个可执行的程序,
# 在终端执行make clean这个指令的时候,不会发生冲突,
# 会正常执行以下的代码
.PHONY:clean
clean:
rm $(OBJ) $(BIN)
--------------------------------------------------------------------------------------------------------------------------------
测试工程
- 工程目录下的结构:
- Makefile文件的内容:(这里CFLAGS中多添加了头文件的路径)
# 通用型makefile
# 利用bash命令 找到当前目录下的所有的.c文件,
# 再存放到变量CSOURCE中
CSOURCE=${shell find . -name "*.c"}
# 如果有其他路径下的.c文件 还可以 用CSOURCE+=来添加
# 文本替换
# 将变量COBJ中的.c文本替换为.o文本
OBJ=$(CSOURCE:.c=.o)
# 将编译参数存放到变量CFLAG中,
# 如果还有其他的头文件路径,可以用 CFLAGS+= 来添加
# 编译参数有:显示所有警告,包含的头文件路径
CFLAGS=-Wall -I./
CFLAGS+= -I./hi/
# 将要生成的工程的名字放到变量BIN中
# 编译指令: make project 或 make ./project
BIN=./project
# 将编译器的名字放到变量CC中
# Linux / windows 用的是: gcc
# 嵌入式arm平台用的是: arm-linux-gcc
CC=gcc
pri:
@echo $(CSOURCE)
@echo $(OBJ)
$(BIN):$(OBJ)
$(CC) $^ -o $@ $(CFLAGS)
%.o:%.c
$(CC) $^ -o $@ -c $(CFLAGS)
# 定义伪目标 clean
# 如果当前目录下有"clean"这个可执行的程序,
# 在终端执行make clean这个指令的时候,不会发生冲突,
# 会正常执行以下的代码
.PHONY:clean
clean:
rm $(OBJ) $(BIN)
- main.c文件内容:
// main.c
#include <stdio.h>
#include "hello.h"
#include "hi.h"
int main(void)
{
print_hello();
print_hi();
return 0;
}
- hello.h文件内容:
// hello.h
#ifndef __HELLO_H
#define __HELLO_H
void print_hello(void);
#endif
- hello.c文件内容:
// hello.c
#include <stdio.h>
#include "hello.h"
void print_hello(void)
{
printf("Hello World! I'm coming!\n");
}
- /hi/hi.h文件内容:
// hi.h
#ifndef __HI_H
#define __HI_H
void print_hi(void);
#endif
- /hi/hi.c文件内容:
// hi.c
#include <stdio.h>
#include "hi.h"
void print_hi(void)
{
printf("Hi! I heard what you said.\n");
}
--------------------------------------------------------------------------------------------------------------------------------
在当前的工程路径的终端输入:(下面的project是在makefile文件中写好的最终要生成的可执行文件的名称,可以到makefile文件中修改成自己想要的名称,例如 修改成demo,在终端make时就要输入 " make demo ")
make project
终端反馈的运行结果:
执行生成的目标文件,在终端输入:
./project
运行结果: