Makefile简述
makefile是一个工程文件的编译规则,描述了整个编译的逻辑和规则,包括编译,链接等等
内容:
1.哪些文件是需要编译的
2.需要包含哪些文件
3.如何生成最终的文件
一般讲上述的功能可以用gcc的编译命令一条条敲出来,但是这样会很麻烦,会花费大量的时间在复制粘贴gcc的编译代码上,而makefile文件+make命令能够很好的一步到位,你只要修改makefile里的代码信息就好
Makefile文件名
makefile文件名一般默认会通过识别GUNmakefile,Makefile,makefile等默认文件名,如果你在VScode里建立一个makefile文件
你会很明显发现makefile会被VS自动识别到
当然你可以直接使用make的命令来手动使用它,这时候其它命名方式也可以成功使用makefile,不过建议命名的时候带上mk后缀,方便编译器识别,也方便自己看
PS D:\WORKSPACEBLAKE\Blake\DIFF_FOUND> ren makefile_for_diff_found .\makefile_for_diff_found.mk
PS D:\WORKSPACEBLAKE\Blake\DIFF_FOUND> make -f .\makefile_for_diff_found.mk
Makefile规则与语法
target ...: prerequisites ...
command
...
target:(你要生成的目标文件)
可以是一个object,file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。可使用通配符,当有多个目标时,目标之间用空格分隔。
prerequisites: (从哪些个文件生成目标文件)
生成该target所需要的依赖项,当有多个依赖项时,依赖项之间用空格分隔。
command: 该target要执行的命令(任意的shell命令)。
– 在执行command之前,默认会先打印出该命令,然后再输出命令的结果;如果不想打印出命令,可在各个command前加上@。
–command可以为多条,可以分行写,但每行都要以tab键开始。另外,如果后一条命令依赖前一条命令,则这两条命令需要写在同一行,并用分号进行分隔。
– 如果要忽略命令的出错,需要在各个command之前加上减号-
总的来说,告诉编译器你要从那个文件生成哪个文件,要执行什么命令
附上自己写的makefile文件代码:
MAKE_EXE = .\debug\main.exe
OBJ_2_MAKE_MAIN_0 = .\gcc\main\main.o
OBJ_2_MAKE_MAIN_1 = .\gcc\main\gvar.o
OBJ_2_MAKE_MAIN = $(OBJ_2_MAKE_MAIN_0) $(OBJ_2_MAKE_MAIN_1)
OBJ_2_MAKE_FUNC_0 = .\gcc\func\func_vesadata.o
OBJ_2_MAKE_FUNC_1 = .\gcc\func\func_debug.o
OBJ_2_MAKE_FUNC = $(OBJ_2_MAKE_FUNC_0) $(OBJ_2_MAKE_FUNC_1)
SOURCE_FILE_MAIN_0 = .\main\main.c
SOURCE_FILE_MAIN_1 = .\main\gvar.c
SOURCE_FILE_MAIN = $(SOURCE_FILE_MAIN_0) $(SOURCE_FILE_MAIN_1)
SOURCE_FILE_FUNC_0 = .\func\func_vesadata.c
SOURCE_FILE_FUNC_1 = .\func\func_debug.c
SOURCE_FILE_FUNC = $(SOURCE_FILE_FUNC_0) $(SOURCE_FILE_FUNC_1)
INCLUDE_FILE = .\inc\
LOCAL_FLAGS = -Wall
#FUNC_LIB_0 =
$(MAKE_EXE):$(SOURCE_FILE_MAIN) $(SOURCE_FILE_FUNC) $(INCLUDE_FILE)
gcc -c $(SOURCE_FILE_MAIN_0) -I $(INCLUDE_FILE) $(LOCAL_FLAGS) -o $(OBJ_2_MAKE_MAIN_0)
gcc -c $(SOURCE_FILE_MAIN_1) -I $(INCLUDE_FILE) $(LOCAL_FLAGS) -o $(OBJ_2_MAKE_MAIN_1)
gcc -c $(SOURCE_FILE_FUNC_0) $(LOCAL_FLAGS) -o $(OBJ_2_MAKE_FUNC_0)
gcc -c $(SOURCE_FILE_FUNC_1) $(LOCAL_FLAGS) -o $(OBJ_2_MAKE_FUNC_1)
gcc $(OBJ_2_MAKE_FUNC) $(OBJ_2_MAKE_MAIN) -o $(MAKE_EXE)
.PONEY:clean_gcc
clean_gcc:
rm -rf ./gcc/*
.PONEY:clean_debug
clean_debug:
rm -rf ./debug/*