一、.C .h文件编写
本文章参考哔哩哔哩李慧琴老师的【c语言】11.如何编写Makefile文件,链接如下如何编写Makefile文件
首先makefile、Makefile的优先级不一样,使用make指令时优先编译makefile文件。
然后我们创建.c以及对应的.h文件。.h文件放函数的声明,.c放函数的实现,main.c放函数的调用。在李慧琴老师讲的例子中需要以下五个文件:
main.c tool1.c tool1.h tool2.c tool2.h
其中main.c调用 tool1、tool2中的函数。
五个文件内容如下:
tool1.h
#ifndef TOOL1_H__
#define TOOL1_H__
void tool1(void);
#endif // tool1.h
tool1.c
#include <stdio.h>
#include "tool1.h"
void tool1()
{
printf("tool1 printf \n");
}
tool2.h
#ifndef TOOL2_H__
#define TOOL2_H__
void tool2(void);
#endif // tool2.h
tool2.c
#include <stdio.h>
#include "tool2.h"
void tool2()
{
printf("tool2 printf \n");
}
main.c
#include <stdio.h>
#include "tool1.h"
#include "tool2.h"
int main()
{
tool1();
toll2();
return0;
}
OK我们在编写好上述文件后,需要编写makefile文件,如果单纯用gcc指令操作,太过麻烦。makefile文件实质是一条条的gcc指令。
二、Makefile文件编写
1.初版makefile文件
//mytool为最终生成的可执行文件
//其依赖main.o tool1.o tool2.o这几个可执行文件
//通过一个TAB 来执行以下command生成目标文件
mytool:main.o tool1.o tool2.o
gcc main.o tool1.o tool2.o -o mytool
//main.0需要生成的可执行文件 ,依赖于main.c
main.o:main.c
// -c 编译 -Wall警告 -g方便调试 -o指定可执行文件名字
gcc main.c -c -Wall -g -o main.o
tool1.o:tool1.c
gcc tool1.c -c -Wall -g -o tool1.o
tool2.o:tool2.c
gcc tool2.c -c -Wall -g -o tool2.o
//删除指令
clean:
rm *.o mytool -rf
写完makefile可以使用make进行编译,编译完成后生成可执行文件mytool,使用命令./mytool可以执行。
2.用变量代替重复指令
在初版makefile存在重复指令,可以将其代替。
OBJS = main.o tool1.o tool2.o
cc = gcc
//+=不管前面发生什么,加上这个功能。用CFLAGS代替编译、警告、调试
CFLAGS += -c -Wall -g
//用$()引用变量
mytool:$(OBJS)
$(cc) $(OBJS) -o mytool
main.o:main.c
$(cc) main.c $(CFLAGS) -o main.o
tool1.o:tool1.c
$(cc) tool1.c $(CFLAGS) -o tool1.o
tool2.o:tool2.c
$(cc) tool2.c $(CFLAGS) -o tool2.o
clean:
$(RM) *.o mytool -r #用大写的RM代替rm以及-rf
3.简化makefile
OBJS=main.o tool1.o tool2.o
cc=gcc
CFLAGS+=-c -Wall -g
//$^ 为依赖文件 $@为生成的可执行文件
mytool:$(OBJS)
$(cc) $^ -o $@
//%为通配符
%.o:%.c
$(cc) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r
OK 结束 不对的地方大家多多指正 哈哈哈
三、补充
//SRCS = $(wildcard *.cpp) 获取当前目录下的c文件集,放在变量SRCS中
SRCS = $(wildcard *.cpp)
//表示将对应的c文件名转化为o文件后,放在OBJS变量中
OBJS = $(patsubst %cpp, %o, $(srcs))
gcc -shared -fPIC -o 1.so 1.c