• [linux]makefile多目录


    在使用makefile多目录编写前需要掌握几个函数及符号

    自定义变量

    target=edit
    引用的时候直接使用 $(target)

    有点像C语言中的#define,这里的 $(target)会被替换成edit.

    也可以替换多个文件,注意空格

    object=main.o xxx.o xxx.o

    自动变量

    自动变量是使用在第二行也就是gcc -c xxx

    $< : 规则中的第一个依赖
    $@:规则中的目标
    $^: 规则中所有的依赖

    $(target):$(obj)
    gcc $^ -o $@
    

    这行代码的意思是规则中所有的依赖($^)(.o文件)生成目标($@)

    $(target)

    自动匹配

    子规则中:
    目标:依赖

    %.o:%.c
    自动匹配终极目标的依赖 :
    main.o:main.c
    add.o:add.c
    sub.o:sub.c

    makefile函数

    pro=$(wildcard src/*.c)
    src=$(wildcard *.c)
    obj=$(patsubst %.c,%.o,$(pro) $(src))
    

    wildcard 查找当前目录下和src目录下所有.c文件,分别返回给pro和src
    pro=$(wildcard *.c)
    src=$(wildcard src/*.c)
    patsubst 替换所有.c文件为.o文件
    obj=$(patsubst %.c,%.o,$(pro) $(src))

    注意:
    我在这里用空格将$(pro) $(src)分隔开,这样在编译的时候系统不会发生main.cxxx.c的情况,也就是头尾相连.

    如此,前期准备工作就完成了.

    代码实现

    .
    ├── main.c
    ├── makefile
    └── src
        ├── Speak.c
        └── Speak.h
    

    main.c

    #include <stdio.h>
    #include "src/Speak.h"
    int main()
    {
    	printf("Helo
    ");
    	Speak();
    	return 0;
    }
    
    

    src/Speak.c

    #include "Speak.h"
    
    void Speak(void)
    {
    printf("Speak
    ");
    }
    

    src/Speak.h

    #include <stdio.h>
    void Speak(void);
    

    在这里开始解释makefile文件

    pro=$(wildcard *.c)
    src=$(wildcard src/*.c)
    obj=$(patsubst %.c,%.o,$(pro) $(src))
    
    target=edit
    
    $(target):$(obj)
    	gcc $^ -o $@
    %.o:%.c
    	gcc -c $< -o $@
    
    .PHONY:clean
    clean:
    	rm  $(obj) $(target) -f
    

    我们将根目录下的.c文件(只有一个main.c)通过wildcard返回给pro

    src目录下的.c文件通过wildcard返回给src

    通过patsubst 替换所有.c文件为.o文件

    然后通过自动匹配依赖

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

    生成各个.c文件的.o文件

    最终生成edit可执行文件

    $(target):$(obj)
    	gcc $^ -o $@
    

    整理:

    1. 利用wildcard返回各个目录下的.c文件,

    2. 利用patsubst将各个.c换成.o(这一步并没有生成.o文件,只是相当于将main.c返回为main.o)

    3. 利用自动匹配自动生成各个.o(这一步才是生成.o文件)

    4. 将所有的.o生成可执行文件edit

  • 相关阅读:
    CTF-cookies欺骗
    CTF-速度要快100
    php实现登录注册界面
    CTF-秋名山老司机 100
    三大类型语句
    PHP运算符
    标记风格和注释
    连接串口服务器时的注意事项
    RS485转以太网的概述和应用领域
    工业级路由器的优点有哪些
  • 原文地址:https://www.cnblogs.com/cnleika/p/11422793.html
Copyright © 2020-2023  润新知