• Makefile文件应用——complicated项目


    •  学习资料

    本文主要参考资料:驾驭Makefile(李云).pdf

    • Complicated项目

    需求:

    (1)object文件放到objs目录下

    (2)可执行文件放到exes目录下

    (3)增加头文件依赖

    • 自动生成依赖关系

    (1)先用编译器为每一个源文件的自动生成的依赖关系放到一个文件(***.dep)中

    gcc的-M和-MM选项

    gcc -M foo.c //-M选项会列出对系统头文件的依赖关系
    
    gcc -MM foo.c //-MM选项不会列出对系统头文件的依赖关系

    (2)写出 .c 文件和 .dep 文件的依赖关系,并让make自动更新或生成 .dep 文件

    foo.dep: foo.c //foo.d依赖foo.c生成
        gcc -MM foo.c

    最终生成的依赖关系:foo.o: foo.c foo.h,存放在foo.d文件中

    (3)对编译器生成的依赖关系文件,进行加工处理

    sed 's,($*).o[ :]*,objs/1.o $@ : ,g' < $@.$$$$ >; $@; 

    这个语句实现将foo.o: foo.c foo.h,更改为objs/foo.o deps/foo.dep: foo.c foo.h

    增加了存放目录,以及deps/foo.dep加入让依赖关系文件也能动态更新。

    (4)实现代码

    $(DIR_DEPS)/%.dep: $(DIR_DEPS) %.c
        @echo "Making $@ ..."
        @set -e; 
        $(RM) $(RMFLAGS) $@.tmp; 
        $(CC) -E -MM $(filter %.c, $^) > $@.tmp; 
        sed 's,($*).o[ :]*,objs/1.o $@ : ,g' < $@.tmp >; $@; 
        $(RM) $(RMFLAGS) $@.tmp; 

    (5)include相关依赖关系文件

     注:有原文章,这里有死循环问题,具体参考:https://blog.csdn.net/mantis_1984/article/details/72598848

    其余目录依赖也有相关问题,可用同样方法解决。

    • 条件语法

    ifdef variable-name
    ifndef variable-name

    有没有定义过某个变量

    ifeq (arg1, arg2)
    ifeq 'arg1' 'arg2'
    ifeq "arg1" "arg2"
    ifeq 'arg1' "arg2"
    ifeq "arg1" 'arg2'

     是否相等或不等

  • 相关阅读:
    异常测试之Socket网络异常
    关于文件的INode与Java中的文件操作接口
    java程序中获取kerberos登陆hadoop
    团队游戏的那些事
    细说内测
    如何搭建视频转码集群、播放服务器
    PropertyPlaceHolderConfigurer中的location是不是用错了?
    浅谈java classloader
    foreach写失效的问题
    ArcGIS中的WKID
  • 原文地址:https://www.cnblogs.com/songdechiu/p/10507987.html
Copyright © 2020-2023  润新知