热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第1期Ubuntu入门篇:【15】LinuxC编程

文章目录简介目标阅读基础环境说明参考资料HelloWorld!创建工程文件夹设置Vi编辑器编写代码编译代码执行代码自定义可执行文件名GCC编译器gcc命令编译错误警告


文章目录

  • 简介
    • 目标
    • 阅读基础
    • 环境说明
    • 参考资料
  • Hello World!
    • 创建工程文件夹
    • 设置Vi编辑器
    • 编写代码
    • 编译代码
    • 执行代码
    • 自定义可执行文件名
  • GCC编译器
    • gcc 命令
    • 编译错误警告
    • 编译流程
  • 最近更新


简介

我们所说的编写代码包括两部分:代码编写和编译,在 Windows 下可以使用 Visual Studio来完成这两部分,可以在 Visual Studio 下编写代码然后直接点击编译就可以了。

但是在 Linux下这两部分是分开的,比如我们用 VIM 进行代码编写,编写完成以后再使用 GCC 编译器进行编译。代码编写工具很多,比如 VIM 编辑器、Emacs 编辑器、VScode 编辑器等等,本教程使用 Ubuntu 自带的 VIM 编辑器。


目标

了解Ubuntu下编写一个简单的代码并执行的流程和gcc编译器。


阅读基础

熟悉计算机。


环境说明


  • windows10

参考资料


  • 原子文档:I.MX6ULL开发指南 第三章

  • NXP官方文档:I.MX6ULL参考手册、数据手册


Hello World!

先来编写一个最简单的“Hello World”程序,把 Linux下的C编程完整的走一遍。


创建工程文件夹

先在用户根目录下创建一个工作文件夹:C_Program,所有的 C 语言练习都保存到这个工
作文件夹下,创建过程如图所示:

BolgImage-20210812212347

进入创建的 C_Program 工作文件夹,为了方便管理,我们后面每个例程都创建一个文件夹来保存所有与本例程有关的文件,创建一个名为“3.1”的文件夹来保存我们的“HelloWorld”程序相关的文件,操作如图所示:

BolgImage-20210812212545


设置Vi编辑器

设置 TAB 键为 4 字节。VI 编辑器默认 TAB 键为 8 空格,我们改成 4 空格。

用 vi 打开文件/etc/vim/vimrc,命令sudo vi /etc/vim/vimrc。在此文件最后面输入如下代码:

set ts=4

添加完成如图所示:

BolgImage-20210812213244

修改完成以后保存并关闭文件。

设置显示行号。VIM 编辑器默认是不显示行号的,不显示行号不利于代码查看,我们设置 VIM 编辑器显示行号,同样是通过在文件/etc/vim/vimrc 中添加代码来实现,在文件最后面加入下面一行代码即可:

set nu

添加完成以后的/etc/vim/vimrc 文件如图所示:

BolgImage-20210812213418

VIM 编辑器可以自行定制,网上有很多的博客讲解如何设置 VIM,感兴趣的可以上网看一下。


编写代码

设置好 VIM 编辑器以后就可以正式开始编写代码了,进入前面创建的“3.1”这个工程文件夹里面,使用 vi 指令创建一个名为“main.c”的文件,然后在里面输入如下代码:

#include int main(int argc, char *argv[]){ printf("Hello World!\n");}

编写完成以后保存退出 vi 编辑器,可以使用“cat”命令查看代码是否编写成功,如图所示:

BolgImage-20210812214430

从图可以看出 main.c 文件编辑完成,代码编辑完成以后我们需要对其进行编译。


编译代码

Ubuntu 下的 C 语言编译器是 GCC,GCC 编译器在我们 Ubuntu 的时候就已经默认安装好了,可以通过如下命令查看 GCC 编译器的版本号

gcc -v

在终端中输入上述命令以后终端输出如图所示:

BolgImage-20210812214719

如果输入命令“gcc -v”命令以后,你的终端输出类似图中的信息,那么说明你的电脑已经有 GCC 编译器了。最后下面的“gcc version 5.4.0”说明本机的 GCC 编译器版本为 5.4.0的

注意观察在图中有“Target: x86_64-linux-gnu”一行,这说明 Ubuntu 自带的 GCC 编译器是针对 X86 架构的,因此只能编译在 X86 架构 CPU 上运行的程序

如果想要编译在 ARM上运行的程序就需要针对 ARM 的 GCC 编译器,也就是交叉编译器!我们是 ARM 开发,因此肯定要安装针对 ARM 架构的 GCC 交叉编译器,当然了,这是后面的事,现在我们不用管这些,只要知道不同的目标架构,其 GCC 编译器是不同的。

如何使用 GCC 编译器来编译 main.c 文件呢?GCC 编译器是命令模式的,因此需要输入命令来使用 gcc 编译器来编译文件,输入如下命令:

gcc main.c

上述命令的功能就是使用 gcc 编译器来编译 main.c 这个 c 文件,过程如图所示:

BolgImage-20210812215014


执行代码

在图中可以看到,当编译完成以后生成一个 a.out 文件,这个 a.out 就是编译生成的可执行文件,执行此文件看看是否和我们代码的功能一样,执行的方法很简单使用命令:“./+可执行文件”,比如本例程就是命令:./a.out,操作如图所示:

BolgImage-20210812215235

在图中执行 a.out 文件以后终端输出了“Hello World!”,这正是 main.c 要实现的功能,说明我们的程序没有错误


自定义可执行文件名

a.out 这个文件的命名是 GCC 编译器自动命名的,那我们能不能决定编译完生成的可执行文件名字呢?肯定可以的,在使用 gcc 命令的时候加上-o 来指定生成的可执行文件名字,比如编译 main.c 以后生成名为“main”的可执行文件,操作如图所示:

BolgImage-20210812215528

在图中,我们使用“gcc main.c –o main”来编译 main.c 文件,使用参数“-o”来指定编译生成的可执行文件名字,至此我们就完成 Linux 下 C 编程和编译的一整套过程


GCC编译器


gcc 命令

在前面我们已经使用过 GCC 编译器来编译 C 文件了,我们使用到是 gcc 命令,gcc 命令格式如下:


gcc [选项] [文件名字]

主要选项如下:

-c只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。

-o:<输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC 默认编译出来的可执行文件名字为 a.out。

-g添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编
译的时候生成调试所需的符号信息。

-O对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进行优化,这样产生的可执行文件执行效率就高。

-O2比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。



编译错误警告

在 Windows 下不管我们用啥编译器,如果程序有语法错误,那么编译的时候都会指示出来,比如开发 STM32 的时候所使用的 MDK 和 IAR,我们可以根据错误信息方便的修改 bug。

**那GCC 编译器有没有错误提示呢?**肯定是有的,我们可以测试一下,新名为“3.2”的文件夹,使用 vi 在文件夹“3.2”中创建一个 main.c 文件,在文件里面输入如下代码:

#include
int main(int argc, char *argv[])
{int a, b; a = 3; b = 4 printf("a+b=\n", a + b);
}

在上述代码中有两处错误:

第 8 行、第一处是“b=4”少写了个一个“;”号。

第 9 行、第二处应该是 printf(“a+b=%d\n”, a + b);

我们编译一下上述代码,看看 GCC 编译器是否能够检查出错误,编译结果如图所示:

BolgImage-20210812220403

从图 中可以看出有一个 error,提示在 main.c 文件的第 9 行有错误,错误类型是在printf 之前没有“;”号,这就是第一处错误,我们在“b = 4”后面加上分号,然后接着编译,结果又提示有一个错误,如图所示:

BolgImage-20210812220538

在图中,提示我们说文件 main.c 的第 9 行:printf(“a+b=\n”, a + b)有 error,错误是因为太多参数了,我们将其改为:printf(“a+b=%d\n”, a + b);

修改完成以后接着重新编译一下,结果如图所示:

BolgImage-20210812220753

在图中我们编译成功,生成了可执行文件 main,执行一下 main,看看结果和我们设计的是否一样,如图所示:

BolgImage-20210812220847

可以看出,GCC 编译器和其它编译器一样,不仅能够检测出错误类型,而且标记除了错误发生在哪个文件、哪一行,方便我们去修改代码


编译流程

GCC 编译器的编译流程是:预处理、编译、汇编和链接


  • 预处理就是展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中
  • 编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。
  • 汇编就是将汇编语言文件编译成二进制目标文件
  • 链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题

前面演示的例程都只有一个文件,而且文件非常简单,因此可以直接使用 gcc 命令生成可执行文件,并没有先将 c 文件编译成.o 文件,然后再链接在一起


最近更新

查看本文最近更新请点击


推荐阅读
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 16.04 系统上配置 Qt 5.5 的交叉编译环境,特别针对 i.MX6 平台进行了优化设置。内容涵盖从基本的软件安装到高级配置的全过程。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 在Linux系统中使用EncFS实现文件夹加密
    为了保护个人隐私或敏感数据不被未经授权的访问,可以通过加密技术来增强安全性。本文介绍如何在Linux系统上使用EncFS工具创建和管理加密文件夹,以确保即使在系统登录状态下,特定文件夹中的数据也保持加密状态。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • Ubuntu系统下的GIF动画录制解决方案
    在撰写文章或教程时,GIF动态图能够有效地传达信息。对于Windows用户而言,ScreenToGif是一款非常实用的工具。而在Ubuntu系统中,用户同样拥有多种选择来创建GIF动画,本文将重点介绍两款录屏工具——Byzanz和Peek。 ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 利用 Calcurse 在 Linux 终端高效管理日程与任务
    对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
author-avatar
Jay_5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有