zoukankan      html  css  js  c++  java
  • 【Linux开发技术之程序构建】Makefile学习(不断更新)

     作者:gnuhpc 
    出处:http://www.cnblogs.com/gnuhpc/ 
      

    1.入门篇

    1)Makefile的作用:帮助编译多文件。

    2)基本编写示例:以如下四个文件为例

    //main.c
    
    #include"mytool1.h"
    #include"mytool2.h"
    int main(int argc,char **argv)
    {
    mytool1_print("hello");
    mytool2_print("hello");
    }
    
    //mytool1.h
    #ifndef _MYTOOL_1_H
    #define _MYTOOL_1_H
    void mytool1_print(char *print_str);
    #endif
    
    //mytool1.c
    #include"mytool1.h"
    void mytool1_print(char *print_str)
    {
    printf("This is mytool1 print %s",print_str);
    }
    
    //mytool2.h
    #ifndef _MYTOOL_2_H
    #define _MYTOOL_2_H
    void mytool2_print(char *print_str);
    #endif
    
    //mytool2.c
    #include"mytool2.h"
    void mytool2_print(char *print_str)
    {
    printf("This is mytool2 print %s",print_str);
    } 
    

    对应进行编译构建的Makefile为

    main:main.o mytool1.o mytool2.o
    
    	gcc -o main main.o mytool1.o mytool2.o
    
    main.o:main.c mytool1.h mytool2.h
    
    	gcc -c main.c
    
    mytool1.o:mytool1.c mytool1.h
    
    	gcc -c mytool1.c
    
    mytool2.o:mytool2.c mytool2.h
    
    	gcc -c mytool2.c
    
    

    Makefile 的本质是参与构建的源代码之间依赖关系和编译方法进行说明。一般采用的格式如下:

    target: components
    TAB rule

    第一行表示的是依赖关系.  第二行是规则,使用TAB 键进行

    main:main.o mytool1.o mytool2.o 就是所谓的依赖关系,实际上是一种庖丁解牛的方式,建议在纸上画好关系依赖图,如本例:

    main
    ---main.o--(main.c,mytool1.h,mytool2.h)
    |
    mytool2.o--(mytool2.c,mytool2.h)
    |
    mytool1.o--(mytool1.c,mytool1.h)

    而gcc -o main main.o mytool1.o mytool2.o 就是所谓的规则。

    3)简化

    $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件,使用替代规则可以简写上例如下:

    main:main.o mytool1.o mytool2.o
    	gcc -o $@ $^
    
    main.o:main.c mytool1.h mytool2.h
    	gcc -c $<
    
    mytool1.o:mytool1.cmytool1.h
    	gcc -c $<
    
    mytool2.o:mytool2.cmytool2.h
    	gcc -c $<
    

    如果有规律的命名规则,则可以简写上例如下:

    main:main.o mytool1.o mytool2.o
    	gcc -o $@ $^
    ..c.o:
    	gcc -c $<
    


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    gluon模块进行数据加载-Dataset和DataLoader
    梯度相关概念
    plt.rcParams参数设置
    矩阵求导(二)
    矩阵求导(一)
    使用MXNet的NDArray来处理数据
    Win10环境下Anaconda安装常用指令以及环境管理
    Git使用vi或vim命令打开、关闭、保存文件
    工作中遇到的问题总结
    学习 Python3 语言
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2316090.html
Copyright © 2011-2022 走看看