0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux 下GCC的编译

科技绿洲 来源:矜辰所致 作者:矜辰所致 2023-09-11 15:18 次阅读

一、Linux 下多文件编译

在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译,在文章我们讲解 GCC 的编译,使用的只使用了一个 .c 文件,直接使用

gcc [目标文件] -o [想要生产的文件名字]

那在遇到多个 .c 文件的时候如何处理呢?

实际上还是使用上面这条指令,其中的 [目标文件] 是可以为多个的。

举一个简单的例子,我们写了三个.c 文件,内容如下:

图片

编译的方式如下图:

图片

这么看起来是不是感觉还算简单?但是我们可以试想一下,以后做项目的时候,成千上万个文件,怎么办?

我们要考虑2个主要问题:

1、 文件数量多起来了以后如何处理?

2、只修改了单个文件,如何只重新编译修改过后的单个文件?

我们不可能和上面示例一样手动使用 gcc 命令输入文件名的,而且文件多起来了,编译时间需要很长,使用上面示例的命令,是会把所有的文件都重新编译,在后面的 linux 学习开发中,项目的编译时间可比学习 51 、STM32 哪些工程的时候多得太多,每次都编译所有文件这种行为肯定是不可取的。

在 Windows 下面我们有各种集成的 IDE 工具,往往只需要一个按钮,就可以编译整个工程,方便快捷,比如我们熟悉的 Keil,我们只需要点击 IDE 工具栏目的一个按钮,就可以完成我们想要的操作:

图片

那么在 Linux 下,我们该如何处理呢?

这就要用到本文主要说明的东西:Make 工具 和 Makefile 。

二、make 工具和 Makefile

首先我们要知道什么是 Make 工具,以及 什么 是 Makefile。

这部分的内容时基本概念,类似名词解释,大家记住就好,没有什么特别需要说明的,因为我们的重点在于知道以及学会他们的使用.

2.1 make 和 Makefile 是什么?

make 工具:

make 本质上它是一个程序,是一个编译工具。我们在后面进行程序的时候,都需要使用 make 命令。

使用 make 工具我们可以自动完成编译工作,而且可以有效的处理我们上面提到的问题:

  1. 多个文件的自动编译;
  2. 每次执行 make 命令,只重新编译修改后的文件;. 这里提一句,Linux 是如何判断文件是否有修改:文件的修改时间!就是通过 ls -l 查看的那个时间,make 会根据依赖关系,如果发现依赖的文件修改时间比自己新,那么久会重新编译一下这个依赖文件)

利用 make 工具可以将大型的开发项目分解成为多个更易于管理的模块,可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系,大大简化开发工作,避免不必要的重新编译 。

make工具通过一个称为 Makefile 的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则。

Makefile 文件:

Makefile 是一个文件,是一个描述一系列规则的文件。

Makefile 的 开头 M 要大写!(虽然有的地方说大小写都可以,但是保证大写,是肯定不会有莫名其妙的问题的)。

make 会根据 Makefile 文件的规则规则执行命令,最后完成编译输出 。

在 Makefile 文件中:

  • 定义一系列的规则来制定源文件编译后的先后顺序
  • 特定的语法规则、支持函数定义、函数调用
  • 能直接集成操作系统中的命令

这是我们学习 Linux 的一个重点对象,对于新手来说,至少要做到能够看得懂,会一定程度的修改 Makefile 。

2.2 通过 STM32 提前熟悉 Makefile

实际上 STM32 的开发,我们也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 开发,不妨使用 GCC 工具链开发,这样也能提前熟悉 Makefile 。

如果是我的粉丝朋友,一定知道现在我做 STM32 都是使用的 gcc 工具链,具体可查看文章:

抛弃IDE — 在window下使用VScode搭建ARM开发环境

如果想看看简单的 Makefile ,大家可以写一个简单的 STM32 工程,然后在 STM32CubeMX 生成工程的时候选择 Makefile ,如下图:

图片

然后打开工程,就可以看看 ST 工具自动生成的 Makefile 文件了,可以让自己提前熟悉熟悉 Makefile:

图片

2.3 GCC 与 make 的关系/区别?

经常有小伙伴会被 GCC 与 make 工具搞得糊里糊涂,虽然知道怎么用,但是傻傻分不清楚或者是说不明白。

看清楚概念:GCC 是编译器,make 是一个命令工具。

感觉把概念一说就清楚了啊, GCC 是一个编译 C语言的编译器, 而 make 是一个工具,他可以使得编译工作简化,只不过我们使用的时候 make 会调用 GCC 编译器去完成编译工作。

在 Makefile 中我们会指定执行编译的编译器类型,而且会根据指定的编译器类型进行对应的命令操作,如下图:

图片

因为我们在 linux 下使用的都是 gcc 编译器,所以 Makefile 中的会看到我们熟悉的 gcc 的操作命令,我们只不过是利用 make 工具的自动编译去调用了 gcc 编译器 对工程进行编译。

三、一个简单的 Makefile

上面说过,Makefile 是学习 Linux 的一个要点之一,对于 Makefile 说明,我会单独分专栏进行说明介绍,那本文我们刚刚接触,我们写一个简单的 Makefile 来编译文章开头我们示例的3个文件。

直接先写一个傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目录下,我们新建一个 Makefile 文件,如下:

图片

然后试着使用 make 命令看看效果:

图片

OK,果然可以 make 直接编译,但是上面这个 Makefile 是有问题的,因为每次执行 make ,会把所有的 .c 文件都重新编译器一次,实际使用也不可能这么写。

我们回忆一下上一篇课程的内容,一个C 文件要经过预处理、编译、汇编 和 链接才能变成可执行文件,由不同的 .c 文件生成到不同的 .o 文件,最终才将所有的 .o 文件链接成可执行文件。

所以我们可分开进行,把每一个 .c 先生成 .o 文件,然后再由 所有的 .o 文件生成 最终的文件,这样如果单独修改了某个文件 ,只需要把修改过的 .c 文件重新编译就行了,所以我们的 Makefile 应该这么写:

图片

make 的结果如下:

图片

这样写得好处就是,如果我们只对某一个.c 文件进行修改,他只会对修改过的文件进行重新编译,我们可以测试一下,比如我们修改一下 a.c 文件:

图片

上面这个简单的 Makefile ,大家是不是已经可以感觉到 make 工具的方便快捷了!

结语

本文向大家介绍了一下 Linux 编程时候使用的 make 工具,如何在没有 IDE 工具的 Linux 环境下高效快捷的编译工程,就靠 make 工具了。

当然,我们的重点在于 Makefile,对于 Makefile 的写法规则,更多的内容我会单独写文章说明的。

对于入门的小伙伴来说,也没有必要一蹴而就,写好 Makefile 固然重要,但是对于现在一般的应用开发来说,Makefile 要完全自己从头写得时候不多,很多时候可以找到一个可用的模板进行修改,我们至少要做到可以看懂,可以去修改 Makefile!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • GCC
    GCC
    +关注

    关注

    0

    文章

    104

    浏览量

    24716
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32397
收藏 人收藏

    评论

    相关推荐

    Linux编程】如何使用gcc编译源代码时输出map文件?

    Linux编程】如何使用gcc编译源代码时输出map文件?
    的头像 发表于 08-15 14:08 6691次阅读
    【<b class='flag-5'>Linux</b>编程】如何使用<b class='flag-5'>gcc</b><b class='flag-5'>编译</b>源代码时输出map文件?

    Linuxgcc编译过程介绍

    工作中,在Linux环境下,有过量产项目的公司,gcc一般都是已经安装好了的。如果需要安装,请从官网下载或网上找资源下载
    发表于 07-14 15:50 370次阅读
    <b class='flag-5'>Linux</b>的<b class='flag-5'>gcc</b><b class='flag-5'>编译</b>过程介绍

    请问有没有人在linux用arm-linux-gcc编译过JM的

    JM18.4现在想在linux(ubuntu12.04)编译可在开发板(芯片:ti omap4460)执行的文件在PC上编译出的lencodldecod可在PC上执行烧到板上显示无法
    发表于 10-26 16:57

    迅为龙芯2K1000开发板Linuxgcc编译

    gcc 全称(gnu compiler collection) 即编译套件, gcc可以支持多种计算机体系结构, 比如 X86、 ARM 、MIPI .在12.2章节中我们在ubuntu系统
    发表于 11-26 09:56

    Linux开发环境的Arm gcc交叉编译介绍

    需要以 Arm 指令集的标准编码。为了让这个流程变得简单,开发者们为不同的芯片开发了不同的编译器,比如针对 Arm 平台的 arm-linux-gcc,针对 mips 平台
    发表于 06-02 18:00

    安装gcc后arm-linux-gcc编译生成的代码却无法执行了

    在Fedora14,刚装完系统时,用arm-linux-gcc (3.4.1版本)编译的程序下到开发板上运行时正常的。当我把Fedora14系统安装了gcc之后,再用arm-
    发表于 10-27 16:21

    浅谈gcc编译

    3.3 gcc编译器 GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言
    发表于 10-18 13:48 0次下载

    Linux下C/C++编译gcc使用指南

    1.gcc包含的c/c++编译gcc,cc与c++,g++ gcc和cc是一样的,c++和g++是一样的。一般c程序就用gcc
    发表于 11-02 10:59 0次下载

    Linux上安装GCC3.4.0编译器过程

    3.4.0比以前版本更好地支持了C++标准。本文以在Redhat Linux上安装GCC3.4.0为例,介绍了GCC的安装过程。 安装之前,系统中必须要有cc或者gcc
    发表于 11-02 11:18 0次下载

    Linux教程之如何对Linux系统下的gcc进行编程的基本使用教程

    GCC是由GNU之父Stallman所开发的linux下的编译器,GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言
    发表于 11-02 15:15 4次下载

    Linux下开发STM32 使用gcc-arm-none-eabi工具链编译生成bin、hex文件

    Linux下开发STM32:使用gcc-arm-none-eabi工具链编译生成bin、hex文件
    的头像 发表于 02-28 15:08 9764次阅读
    <b class='flag-5'>Linux</b>下开发STM32 使用<b class='flag-5'>gcc</b>-arm-none-eabi工具链<b class='flag-5'>编译</b>生成bin、hex文件

    gcc的使用方法以及Linux gcc 的常用选项

    gcc的使用方法 gcc 【选项】文件名 gcc常用选项 gcc -v: 查看gcc编译器的版本
    的头像 发表于 10-22 14:42 2717次阅读

    嵌入式Linux的OpenVPN移植

    器:arm-linux-gnueabihf-gcc 编译OpenVPN采用的编译器要与编译Linux内核所用的
    发表于 11-01 16:58 32次下载
    嵌入式<b class='flag-5'>Linux</b>的OpenVPN移植

    Linux编程】如何使用gcc生成预编译文件?

    Linux编程】如何使用gcc生成预编译文件?
    的头像 发表于 08-31 13:07 1572次阅读
    【<b class='flag-5'>Linux</b>编程】如何使用<b class='flag-5'>gcc</b>生成预<b class='flag-5'>编译</b>文件?

    Linux使用gcc编译程序的语法

    01. 调试相关的宏 在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。 gcc编译的过程中,会生成一些宏,可以使用
    的头像 发表于 06-22 10:51 382次阅读