Ⅹ变量与函数的综合实例

Request

  1. 自动生成target文件夹存放可执行文件。

  2. 自动生成obj文件夹存放编译生成的目标文件.o

  3. 支持调试版本的编译选项

  4. 考虑代码的扩展性

  5. $(wildcard _pattern)

    满足_pattern的文件或目录列表

  6. $(addprefix _prefix,names)

    给名字列表names中的每一个名字曾家前缀_prefix.

Skill

  1. 自动获取当前目录下的源文件列表(函数调用)
SRCS := $(wildcard *.c)
  1. 根据源文件列表生成目标文件列表(变量的值替换)
OBJS := $(SRCS:.c =.o)
#不能有空格
  1. 对每一个目标文件列表加上路径前缀(函数调用)
OBJS := ( addprefix path/ , $(OBJS) )

规则中的模式替换

%.o : %.c
gcc -o $@ -c $^

针对于当前工作目录

OBJS := func.o main.o
$(OBJS) : %.c
gcc -o $@ -c $^

针对于变量(OBJS)列表

编译规则中的依赖

				->dirs           (创建文件夹)
all -> targets -> ->objs (生成可执行文件)
->生成可执行文件 (链接)

Summary

  • 目录可以成为目标的依赖,在规则中创建目录。
  • 预定义函数是makefile实战中时不可或缺的部分。
  • 规则中的模式匹配可以直接针对目录中的文件。
  • 可以使用命令行变量便须特殊的目标版本。

工程实例

在工程文件夹下新建立了main.c func.c func.h.(放在同一文件夹下)。

现在已经是第二天。如果.H 文件放在inc文件夹下面会更合适。也会更加符合实际的工程应用。

main.c

#include <stdio.h>
#include "func.h"

int main(){
print("%s\n",);
return 0;
}

func.c

const char* String = "My Densitiy"

func.h

#ifndef __FUNC__
#define __FUNC__

extern cont char* String;
#endif

makefile

CC := gcc
MKDIR := mkdir
RM := rm -fr

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello_makefile.out

SRCS := $(wildcard *.c)
#获取源文件列表
#main.c func.c

OBJS := $(SRCS:.c=.o)
#值替换 main.o func.o
#debug TODO:can't use to space in $(SRCS:.c=.o)
#用于生成目录下的列表

OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
#添加路径前缀objs/main.o
#objs/mian.o objs/func.o

.PHONY: rebuild clean all

$(TARGET) : $(DIRS) $(OBJS)
@$(CC) -o $@ $(OBJS)
@echo "Target File ==> $@"
@./$(TARGET)

$(DIRS):
@$(MKDIR) $@

$(DIR_OBJS)/%.o : %.c
ifeq ($(DEBUG),true)
@$(CC) -o $@ -g -c $^
else
@$(CC) -o $@ -c $^
endif

rebuild:clean all

all : $(TARGET)

clean:
$(RM) $(DIRS)
Author: 浩然天成
Link: http://aronzhc.github.io/2021/04/21/Ⅹ变量与函数的综合实例/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.