美文网首页Linux
Linux-Makefile(二)

Linux-Makefile(二)

作者: 飞向深空 | 来源:发表于2022-01-08 16:50 被阅读0次
    #生成可执行文件的名称
    Target = file_demo
    ARCH ?= x86
    
    #编译器 CC
    #根据传入的参数 ARCH,确定使用的编译器
    #默认使用 gcc 编译器
    #make ARCH=arm 时使用 ARM-GCC 编译器
    ifeq ($(ARCH), x86)
        CC = gcc
    else
        CC = arm-linux-gnueabihf-gcc
    endif
    
    #存放中间文件的路径
    build_dir = build_$(ARCH)
    
    #存放源文件的文件夹
    src_dir = .
    
    #存放头文件的文件夹
    inc_dir = includes .
    
    #源文件
    sources = $(foreach dir,$(src_dir),$(wildcard $(dir)/*.c))
    
    # 目标文件(*.o)
    objects = $(patsubst %.c,$(build_dir)/%.o,$(notdir $(sources)))
    
    # 头文件
    includes = $(foreach dir,$(inc_dir),$(wildcard $(dir)/*.h))
    
    # 编译参数
    # 指定头文件的路径
    CFLAGS = $(patsubst %, -I%, $(inc_dir))
    
    # 链接过程
    # 开发板上无法使用动态库,因此使用静态链接的方式
    $(build_dir)/$(Target) : $(objects) | create_build
        $(CC) $^ -o $@
    
    # 编译工程
    # 编译 src 文件夹中的源文件,并将生成的目标文件放在 objs 文件夹中
    $(build_dir)/%.o : $(src_dir)/%.c $(includes) | create_build
        $(CC) -c $(CFLAGS) $< -o $@
    
    
    # 以下为伪目标,调用方式:make 伪目标
    #clean:用于 Clean Project
    #check:用于检查某个变量的值
    .PHONY:clean cleanall check create_build
    
    # 按架构删除
    clean:
        rm -rf $(build_dir)
    
    # 全部删除
    cleanall:
        rm -rf build_x86 build_arm
    
    # 命令前带"@", 表示不在终端上输出执行的命令
    # 这个目标主要是用来调试 Makefile 时输出一些内容
    check:
        @echo $(CFLAGS)
        @echo $(CURDIR)
        @echo $(src_dir)
        @echo $(sources)
        @echo $(objects)
    
    # 创建一个新目录 create,用于存放过程文件
    create_build:
        @mkdir -p $(build_dir)
    
    

    相关文章

      网友评论

        本文标题:Linux-Makefile(二)

        本文链接:https://www.haomeiwen.com/subject/mngecrtx.html