作者:Jay_5 | 来源:互联网 | 2023-09-05 09:46
文章目录简介目标阅读基础环境说明参考资料HelloWorld!创建工程文件夹设置Vi编辑器编写代码编译代码执行代码自定义可执行文件名GCC编译器gcc命令编译错误警告
文章目录
- 简介
- Hello World!
- 创建工程文件夹
- 设置Vi编辑器
- 编写代码
- 编译代码
- 执行代码
- 自定义可执行文件名
- GCC编译器
- 最近更新
简介
我们所说的编写代码包括两部分:代码编写和编译,在 Windows 下可以使用 Visual Studio来完成这两部分,可以在 Visual Studio 下编写代码然后直接点击编译就可以了。
但是在 Linux下这两部分是分开的,比如我们用 VIM 进行代码编写,编写完成以后再使用 GCC 编译器进行编译。代码编写工具很多,比如 VIM 编辑器、Emacs 编辑器、VScode 编辑器等等,本教程使用 Ubuntu 自带的 VIM 编辑器。
目标
了解Ubuntu下编写一个简单的代码并执行的流程和gcc编译器。
阅读基础
熟悉计算机。
环境说明
参考资料
Hello World!
先来编写一个最简单的“Hello World”程序,把 Linux下的C编程完整的走一遍。
创建工程文件夹
先在用户根目录下创建一个工作文件夹:C_Program,所有的 C 语言练习都保存到这个工
作文件夹下,创建过程如图所示:
进入创建的 C_Program 工作文件夹,为了方便管理,我们后面每个例程都创建一个文件夹来保存所有与本例程有关的文件,创建一个名为“3.1”的文件夹来保存我们的“HelloWorld”程序相关的文件,操作如图所示:
设置Vi编辑器
设置 TAB 键为 4 字节。VI 编辑器默认 TAB 键为 8 空格,我们改成 4 空格。
用 vi 打开文件/etc/vim/vimrc,命令sudo vi /etc/vim/vimrc
。在此文件最后面输入如下代码:
set ts=4
添加完成如图所示:
修改完成以后保存并关闭文件。
设置显示行号。VIM 编辑器默认是不显示行号的,不显示行号不利于代码查看,我们设置 VIM 编辑器显示行号,同样是通过在文件/etc/vim/vimrc 中添加代码来实现,在文件最后面加入下面一行代码即可:
set nu
添加完成以后的/etc/vim/vimrc 文件如图所示:
VIM 编辑器可以自行定制,网上有很多的博客讲解如何设置 VIM,感兴趣的可以上网看一下。
编写代码
设置好 VIM 编辑器以后就可以正式开始编写代码了,进入前面创建的“3.1”这个工程文件夹里面,使用 vi 指令创建一个名为“main.c”的文件,然后在里面输入如下代码:
#include int main(int argc, char *argv[]){ printf("Hello World!\n");}
编写完成以后保存退出 vi 编辑器,可以使用“cat”命令查看代码是否编写成功,如图所示:
从图可以看出 main.c 文件编辑完成,代码编辑完成以后我们需要对其进行编译。
编译代码
Ubuntu 下的 C 语言编译器是 GCC,GCC 编译器在我们 Ubuntu 的时候就已经默认安装好了,可以通过如下命令查看 GCC 编译器的版本号:
gcc -v
在终端中输入上述命令以后终端输出如图所示:
如果输入命令“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 文件,过程如图所示:
执行代码
在图中可以看到,当编译完成以后生成一个 a.out 文件,这个 a.out 就是编译生成的可执行文件,执行此文件看看是否和我们代码的功能一样,执行的方法很简单使用命令:“./+可执行文件
”,比如本例程就是命令:./a.out,操作如图所示:
在图中执行 a.out 文件以后终端输出了“Hello World!”,这正是 main.c 要实现的功能,说明我们的程序没有错误。
自定义可执行文件名
a.out 这个文件的命名是 GCC 编译器自动命名的,那我们能不能决定编译完生成的可执行文件名字呢?肯定可以的,在使用 gcc 命令的时候加上-o 来指定生成的可执行文件名字,比如编译 main.c 以后生成名为“main”的可执行文件,操作如图所示:
在图中,我们使用“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 编译器是否能够检查出错误,编译结果如图所示:
从图 中可以看出有一个 error,提示在 main.c 文件的第 9 行有错误,错误类型是在printf 之前没有“;”号,这就是第一处错误,我们在“b = 4”后面加上分号,然后接着编译,结果又提示有一个错误,如图所示:
在图中,提示我们说文件 main.c 的第 9 行:printf(“a+b=\n”, a + b)
有 error,错误是因为太多参数了,我们将其改为:printf(“a+b=%d\n”, a + b);
修改完成以后接着重新编译一下,结果如图所示:
在图中我们编译成功,生成了可执行文件 main,执行一下 main,看看结果和我们设计的是否一样,如图所示:
可以看出,GCC 编译器和其它编译器一样,不仅能够检测出错误类型,而且标记除了错误发生在哪个文件、哪一行,方便我们去修改代码。
编译流程
GCC 编译器的编译流程是:预处理、编译、汇编和链接。
- 预处理就是展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中。
- 编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。
- 汇编就是将汇编语言文件编译成二进制目标文件。
- 链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题。
前面演示的例程都只有一个文件,而且文件非常简单,因此可以直接使用 gcc 命令生成可执行文件,并没有先将 c 文件编译成.o 文件,然后再链接在一起。
最近更新
查看本文最近更新请点击