Linux学习笔记——Linux中GCC及Makefile

  经过了几个月的咕咕咕实习后,俺胡汉三又回来啦!

  通过实际参与产品开发,确实体会到了一个嵌入式开发者想要做出一个好的系统是非常具有难度的,需要考虑的东西比较多,而这些都需要学习。而基本功是这些的基础。

  所以为了练成六脉神剑攀登更高的技术之峰,长期的学习是必不可少的!


“GUN Compiler Collection”

  GCC编译器想必大家都有所耳闻,作为一个非常著名的编译器集,它可以在Linux环境下快速部署,并且提供了c,c++,java等语言的编译工具。

  在实际的嵌入式开发中,由于资源的有限性,编译环境不能在嵌入式机上搭建,而需要在X68,X64(即我们平常使用的PC机)上搭建,这种在一种架构主机上编译另一种架构主机的程序的方法就叫做交叉编译,在这个过程中使用的工具就叫做交叉编译器,而GCC就是一种可以提供交叉编译的编译器。

 


一个荔枝(例子)

  在实际开发中,GCC拥有很多命令,而这些命令对应不同的功能,这些由大家自己了解,在下面的这个例子中,我们来看一看GCC的实际用途。

  首先是下载安装Linaro的交叉编译器,具体安装方法略(笔者使用的是虚拟机,并使用了FTP传输安装文件)

  然后我们写两个C小例程:

  Linux学习笔记——Linux中GCC及Makefile

 

   main.c

#include <stdio.h>
#include "getmax.h"

int main(int argc, char *argv[])
{
    int a, b, max;
    printf("please input two num: \r\n");
    scanf("%d %d", &a, &b);
    printf("\r\n");

    max = getmax(a, b);
    printf("max num is %d \r\n", max);
}

  getmax.c

#include <stdio.h>
#include "getmax.h"

int getmax(int a, int b)
{
    return (a>b) ? a : b ;
}

  getmax.h

#ifndef __GETMAX_H__
#define __GETMAX_H__

int getmax(int a, int b);

#endif

  然后,我们用gcc -o命令进行编译,使用方法:gcc  源文件  -o  目标文件名

  之后查看列表,发现main已经编译出来了(欢呼),我们可以试一试(如图)。

  Linux学习笔记——Linux中GCC及Makefile

 

   通过gcc,我们在本机上运行了程序。(交叉编译具体操作之后板子到手后会进行博客更新)

  但是亲爱的老伙计们,大家想一想,如果我们是一个很多人的团队,团队成员在项目中写入了海量的.c文件,这个编译命令将会巨长无比。而且,每当团队中的一个人优化或者更改了代码,这个命令还要再写一遍,这岂不是无比麻烦?

  这时就要引出另一个脚本程序了,那就是每一个Unix程序员都需要了解的Makefile,它提供了一个面对海量文件的高效方法——”自动化编译“。


Makefile

  话不多说,根据上面的目的,我们直接应用,首先来看下Makefile的基本语法:

 

  目标文件:  依赖文件集合

    从依赖生成目标的命令

 

  以前面的例子来说,目标文件就是main 依赖文件就是main.o getmax.o (通过gcc -c 命令编译生成.o文件),命令就是 gcc -o main main.o getmax.o 

  注意:一些命令前,必须使用TAB键空行,不可以使用空格。

  

  实际编写:

  在程序目录下创建一个名字为Makefile的文件,代码如下:

 

main: main.o getmax.o
    gcc -o main main.o getmax.o
main.o: main.c
    gcc -c main.c
getmax.o: getmax.c
    gcc -c getmax.c

 

  编写完成后,直接使用make命令,即可编译成功。

  当然,Makefile还有很多其他用法,比如增加一个清楚之前编译后的.o和运行文件的命令,只需在下面增加

cleanfile:
    rm *.o
    rm main

 

  使用make cleanfile命令,就可以清除之前编译出的.o文件和make文件。

  

  但是,既然是“自动化编译”,就要把自动化理念贯彻到底,当引入模式规则自动化变量后,Make文件将会变得更加简单便利,这里我们使用一些新的模式规则和自动化变量语句(其他未使用的可自行查找资料了解) 。

 

  即将使用的模式规则:

  %.o:%.c

    命令

  这里%.c是所有以.c结尾的文件(这个单条命令可以根据文件多少执行很多次),目标%.o的值决定了依赖%.c的值,而%.o的值通过自动化变量获取。

   即将使用的自动化变量:

  $<

  这个变量代表依赖文件集合的第一个文件,如果使用了%(模式规则),则这个变量代表符合模式规则的一系列文件集合。

  具体编程中,我们将main.o getmax.o 作为一个变量使用,并通过$(变量名)引用这个变量。

  

  更改Makefile脚本如下:

objects = main.o getmax.o

main: $(objects)
    gcc -o main $(objects)

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

cleanfile:
    rm *.o
    rm main

  我们发现,Makefile脚本变的非常简单(让人舒爽),而这无疑会减少我们的编写量。

  使用make命令进行编译,得到了和之前同样效果的文件,自动化编译方法实践成功!

 

 

  部分程序参考:正点原子Linux驱动开发指南

上一篇:【Linux编程】Makefile 的工作流程!


下一篇:makefile