• makefile 工程管理


    GNU make

    Linux程序员必须学会使用GNU make来构建和管理自己的软件工程。

    GNU 的 make 能够使整个软件工程的编译、链接只需要一个命令就可以完成。

    Makefile

    make在执行时,需要一个名为Makefile的文件。

    Makefile文件描述了整个工程的编译,链接等规则。

      其中包括哪些源文件需要编译以及如何编译;

      需要创建哪些库文件以及如何创建这些库文件;

      如何最后产生我们想要的可执行文件。

    Makefile(例子)

    hello:main.o func1.o func2.o
        gcc main.o func1.o func2.o -o hello
    main.o:main.c
        gcc -c main.c
    func1.0:func1.c
        gcc -c func1.c
    func2.o:func2.c
        gcc -c func2.c
    .PYONY:clean
    clean:
        rm -f hello main.o func1.o func2.o

    由main.c  func1.c  func2.c文件生成一个hello的可执行文件。

    Makefile(术语)

    规则:用于说明如何生成一个或多个目标文件。

    规则格式

    targets : prerequisites
      command
    目标 : 依赖
      命令
    main.o : main.c
      gcc -c main.c  

    注意:命令需要以 [TAB] 键 开始。

    目标

    在Makefile中,规则的顺序是很重要的。

    Makefile中只应该有一个最终目标,其它的目标都是被整个目标所连带出来的。

    所以,一定要让 make 知道最终目标是什么。

    一般来说,定义在Makefile 中的目标可能会有很多,但是,

    第一条规则中的目标将被确立为最终目标。

    文件名

    make 命令默认在当前目录下寻找名字为 makefile 或 Makefile 的工程文件。

    当名字不为这两者之一时,可以使用 make -f 文件名 来指定。

    伪目标:

    makefile 中把那些没有任何依赖只有执行动作的目标称为"伪目标"(phony targets)。

    .PHONY : clean
    clean :
        rm -f hello main.o func1.o func2.o

    ".PHONY" 将 “clean” 目标声明为伪目标。

     当执行make后会生成很多 *.o文件,如果加上上面的clean,再执行  make clean  会按照上面的命令删除指定的目标文件。

    变量

    hello : main.o func1.o func2.o
        gcc main.o func1.o func2.o -o hello

    思考:如果要为 hello 目标添加一个依赖,如:func3.o,该如何修改?

    答案1:

    hello : main.o func1.o func2.o func3.o
        gcc main.o func1.o func2.o func3.o -o hello

    答案2:

    obj = main.o func1.o func2.o func3.o
    hello : $(obj)
        gcc $(obj) -o hello

    在 makefile 中,存在系统默认的自动化变量

    $^ : 代表所有的依赖文件

    $@ : 代表目标

    $< : 代表第一个依赖文件

    例:

    hello : main.o func1.o func2.o
        gcc main.o func1.o func2.o -o hello

    改写成==>

    hello : main.o func1.o func2.o
        gcc $^ -o $@

    注释和取消回显

    Makefile 中 “#”字符后的内容被视作注释。

    @:取消回显

    hello : hello.c
        @gcc hello.c -o hello
  • 相关阅读:
    使用pycharm开发代码上传到GitLab和GitHub
    私有仓库GitLab快速入门篇
    修改Linux Operating System的时间与时区
    版本控制工具Git工具快速入门-Linux篇
    Hadoop生态圈-Oozie实战之调度shell脚本
    Hadoop生态圈-Oozie实战之逻辑调度执行多个Job
    JavaScript基础知识-相等运算符
    Hadoop生态圈-Oozie部署实战
    Tomcat定义虚拟主机案例
    Tomcat的配置文件详解
  • 原文地址:https://www.cnblogs.com/doitjust/p/9823346.html
Copyright © 2020-2023  润新知