今天是入职的第一天,在公司从事SOC的开发,需要用到Linux的知识,所以开始和大家一起学习Linux的编程,使用Linux运行我们的第一个C语言程序。
使用语句:sudo apt-get install vim 安装 vim,可以在安装前查看是否安装vim编辑器。(特别提示:在安装vim前最好将软件更新,使用指令sudo apt-get update)之所以要加sudo的原因是这些安装和更新软件的时候需要使用管理员权限才可以进行。
和安装 vim 类似使用 sudo apt-get install gcc ,安装完成后可以使用cc-v来查看编译器版本信息等。cc -v界面如下:

在我们编写第一个C程序之前我们需要先新建一个文件夹,用于储存我们的工程,下面是新建文件的详细教程:
我们在Linux中新建文件夹主要有两种方式,如果你的Linux是桌面版本的话,就可以像在Windows环境下一样,通过在文件夹右键进行新建。如果我们的Linux版本不是桌面版,那么只能通过指令进行新建文件夹。
创建文件夹前可以使用 指令 ls 来查看该系统中有哪些文件。然后使用 mkdir+文件名 创建文件,并且查看该文件是否被创建。(假如创建了一个名字为 Workspace 的文件 mkdir workspace)进入该文件则使用命令 cd workspace 然后就进入该目录。然后再创建一个文件名为les1 的文件(mkdir les1)。进入les1文件(cd les1)。创建一个.c文件:touch main.c。
输入 vi main.c 进入文档编辑界面,按i或者 insert 键进入插入模式,然后编写一个c程序:
#include <stdio.h>
int main()
{
printf("hello word!\n");
}
按 esc 键退出插入模式,然后输入 :wq 保存并退出,
这时候你就能在文件夹里发现 hello.c 这一文件,但这只是一个脚本,想要运行该脚本,必须通过编译,生成一可执行文件。
上文提到,gcc编译工具主要完成c语言源程序到可执行文件的转换,那么gcc编译器到底如何使用呢。
首先来了解gcc命令的语法格式:
gcc 语法格式:gcc [选项] 参数
gcc 命令的主要选项及作用:
[-o] 指定目标文件的名称
[-g] 使生成的可执行程序中包含debug信息
[-c] 只编译不链接。(c就是compile)
[-E] 只做预编译处理。
[-S] 由C翻译成汇编
在选项省略的情况下,gcc是最简单的使用方式。
编辑完成后,在命令终端输入命令:gcc main.c 。这时会生成一个名为 a.out 的可执行文件,但是不推荐使用该方法进行编译。
若想指定可执行文件名称为 main’ ,则在命令终端输入命令:gcc -o main main.c
通过 ls 命令可以发现多出了一个名为:main 的文件,我们可以通过语句 ./main 语句运行我们的程序,可以发现我们的程序进行了正确输出:
jamesbin@jamesbin:~/libin/third_make$ gcc main.c -o main
jamesbin@jamesbin:~/libin/third_make$ ls
main main.c
jamesbin@jamesbin:~/libin/third_make$ ./main
hello word!
jamesbin@jamesbin:~/libin/third_make$
可以看到我么已经成功输出了 hello word!
该阶段主要是处理源文件中所有的伪指令,包括宏定义、头文件包含等,gcc会将头文件及宏定义的内容全部展开到当前文件中。
命令:gcc -E -o main.i main.c
其中 main.i 就是预编译后生成的中间文件,可以使用 vi 打开 main.i ,查看其内容。
在该阶段,编译器完成c语言到汇编语言的转换
命令:gcc -S -o main.s main.i 或者直接gcc main.i -S 也会生成main.s文件
(问题:直接gcc main.i -s会生成a.out文件,也可以正常执行)
注意:选项中S为大写,不能用小写
#测试:
jamesbin@jamesbin:~/libin/third_make$ gcc main.i -S
jamesbin@jamesbin:~/libin/third_make$ ls
main.c main.i main.s
这样在当前目录下就生成了一个 main.s 文件(文件内容为汇编语言)。
该阶段是将汇编语言翻译成二进制目标代码。
命令:gcc -c -o main.o main.s
执行命令后,会在当前目录下生成名为main.o的二进制文件
#查看二进制文件
od main.o
在该阶段链接器将多个目标代码文件(以后还可能和库文件)进行链接,最终生成可执行文件。
输入命令:gcc main.o ,会生成一个名为 a.out 的可执行文件
输入命令:gcc -o main main.o ,会生成一个名为 main 的可执行文件。
执行a.out或main文件,在终端输入./a.out或./main
通常情况下,我们将前三步统称为编译阶段,将最后一步成为链接阶段。