zoukankan      html  css  js  c++  java
  • 简单的makefile

    单一程序

    准备一个hello.c

    #include <stdio.h>
    int main(void)
    {
        printf("Hello World!
    ");
    }
    

    gcc hello.c,执行文件名被自动设置成a.out,可用./a.out直接执行,因为这是编译成功的可执行二进制程序

    gcc -c hello.c产生目标文件hello.o
    gcc -o hello hello.o利用目标文件制作一个名为hello的执行文件

    主、子程序链接

    准备一个主程序thanks.c,一个子程序thanks_2.c

    //thanks.c
    #include <stdio.h>
    int main(void)
    {
        printf("Hello World
    ");
        thanks_2();
    }
    
    //thanks_2.c
    #include <stdio.h>
    void thanks_2(void)
    {
        printf("Thank you!
    ");
    }
    

    进行编译与链接
    gcc -c thanks.c thanks_2.c制作出两个.o文件
    gcc -o thank thanks.o thanks_2.o产生thanks可执行程序

    如果以后更新了thanks_2.c文件,只需要重新编译来产生新的thanks_2.o,然后再链接制作出最后的程序即可,不用再编译thanks.c

    调用外部函数库

    //sin.c
    #include <stdio.h>
    #include <math.h>
    int main(void)
    {
        float value;
        value = sin (3.14 / 2);
        printf("%f
    ", value);
    }
    

    数学函数库使用的是libm.so这个函数库,最好在编译的时候将它包含进去
    gcc sin.c -lm -L/lib -L/lib64
    -l: 是加入某个函数库的意思
    m: 是libm.so这个函数库
    由于Linux默认将函数库放置在lib和lib64中,所以不写也没关系

    用make进行宏编译

    准备4个文件main.c, haha.c, sin_value.c, cos_value.c

    //main.c
    #include <stdio.h>
    #define pi 3.14159
    char name[15];
    float angle;
    
    int main(void)
    {
    	printf ("
    
    Please input your name: ");
    	scanf  ("%s", &name );
    	printf ("
    Please enter the degree angle (ex> 90): " );
    	scanf  ("%f", &angle );
    	haha( name );
    	sin_value( angle );
    	cos_value( angle );
    }
    
    //haha.c
    #include <stdio.h>
    int haha(char name[15])
    {
    	printf ("
    
    Hi, Dear %s, nice to meet you.", name);
    }
    
    //sin_value.c
    #include <stdio.h>
    #include <math.h>
    #define pi 3.14159
    float angle;
    
    void sin_value(void)
    {
    	float value;
    	value = sin ( angle / 180. * pi );
    	printf ("
    The Sin is: %5.2f
    ",value);
    }
    
    //cos_value.c
    #include <stdio.h>
    #include <math.h>
    #define pi 3.14159
    float angle;
    
    void cos_value(void)
    {
    	float value;
    	value = cos ( angle / 180. * pi );
    	printf ("The Cos is: %5.2f
    ",value);
    }
    
    正常的步骤
    gcc -c main.c haha.c sin_value.c cos_value.c
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
    ./main
    

    使用make
    先准备一个makefile文件

    $vim makefile
    main: main.o haha.o sin_value.o cos_value.o
        gcc -o main main.o haha.o sin_value.o cos_value.o -lm
    $make
    $make 再一次
    

    make比shell脚本好在:它能主动判断哪一个源代码有修改过,并仅更新该文件

    makefile的基本语法和变量

    target: target_file1 target_file2 ...
    <tab> gcc -o exe_file_name target_file1 target_file2 ...
    
    • makefile中#代表注释
    • <tab>需要在命令行的第一个字符
    • target与其依赖文件之间要用:分隔

    如果想拥有两个以上的操作时,可如此制作makefile文件

    main: main.o haha.o sin_value.o cos_value.o
        gcc main main.o haha.o sin_value.o cos_value.o -lm
    clean:
        rm -fv main main.o haha.o sin_value.o cos_value.o
    
    test:
    $make clean
    $make main
    

    再改进一下:

    LIBS = -lm
    OBJS = main.o haha.o sin_value.o cos_value.o
    main: ${OBJS}
        gcc -o main ${OBJS} ${LIBS}
    clean:
        rm -fv main ${OBJS}
    

    变量的基本语法:

    • 变量与变量内容以=分隔,两边允许空格
    • 变量左边不可以有tab, :
    • 变量应该大写
    • 使用方式,以${变量}的形式
  • 相关阅读:
    小事引发的思考
    C++程序设计教程学习(0)-引子
    Cygwin安装
    PATHEXT环境变量简介
    Oracle Real Application Cluster
    SQLNET.AUTHENTICATION_SERVICES参数说明
    用神经网络拟合数据
    用PyTorch自动求导
    用PyTorch做参数估计
    深度学习基础(概念性)
  • 原文地址:https://www.cnblogs.com/sayiqiu/p/10678374.html
Copyright © 2011-2022 走看看