1.环境配置
在Linux操作系统中(),打开终端,以管理员root模式登录
1.更新:输入命令apt
2.下载vim:输入命令apt vim -y
3.下载gcc:输入命令apt gcc -y
4.下载g++:输入命令apt g++ -y
5.下载make:输入命令apt make -y
安装成功:
2.创建一个 C 程序
【示例1】输出Hello word!
1.首先进入要创建文件的目录,然后创建一个.c文件:
例如在这里创建一个main.c文件
2.通过vi打开main.c文件
(1)输入vi,进入命令模式,在命令模式下不能进行一般的输入操作。
(2)输入 i 进入插入模式
例子:
在插入模式下,您可以执行输入操作:
输入信息后,按Esc返回命令模式:
(3)输入:进入末行模式:
(4)输入wq,回车保存退出:
3.编译C程序
在main.c中写入一段代码后,在终端输入gcc -o main main.c,对main.c文件进行编译:
这时候我们可以看到在当前目录下生成了一个可执行程序main,我们用ls -l查看的话发现这个生成的文件是有可执行权限的,也就是说可以运行了。
4.执行C程序
输入要执行的C程序的可执行程序路径:
相当于:
5.C程序的编译和链接过程
C语言源程序的后缀必须为.c,源文件存放在硬盘上是永久保存的。C语言的.c程序不能直接执行,必须经过编译、链接后才能生成计算机上能执行的二进制可执行程序,然后这个二进制可执行程序才能运行。可以使用gcc -o main main.c将不可执行的.c程序转换成可执行的二进制程序main。
程序编译的过程分为预编译、编译、汇编和链接4个步骤,通过这四个步骤将高级语言翻译成机器指令(二进制),最终的二进制机器指令可以在计算机上直接执行。
【示例】进入vi,编写一段C语言代码,初始化一个数组,并保存
1. 预编译阶段
(1)删除所有“#”,并展开所有宏定义;
(2)处理所有条件预编译指令,例如“#if”、“#ifdef”、“#endif”等。
(3)处理“#”预编译指令,将包含文件插入到预编译指令的位置;
(4)删除所有评论;
(5)增加行号和文件名标识符,以便编译器能够生成用于调试的符号信息,并在编译过程中产生编译错误和警告时显示行号;
(6)保留所有# 指令,因为编译器需要使用它们。
例子:
删除main文件后,预编译当前的main.c文件,使用gcc -E main.c -o main.i预编译main.c文件,并显示结果,可以看到生成了main.i文件:
使用 vi 打开 main.i 文件:
可以看到文件完全展开,宏也展开,并且注释被删除。
2. 编译阶段
词法分析、语法分析、语义分析、代码优化、总结符号。
例子:
使用gcc -S main.i -o main.s将预编译文件main.i转换为编译文件main.s,并用vi打开main.s文件:
main.s 文件充满了汇编代码:
3.组装阶段
将汇编指令翻译成二进制格式,生成个体,并生成符号表。
例子:
使用gcc -c main.s -o main.o将编译阶段生成的main.s文件转换成汇编的二进制机器指令main.o,并用vi打开main.o文件:
main.o文件是二进制机器指令:
上图的ELF文件就是这个文件的格式。
虽然main.o是二进制指令文件,但是它并不能被执行,因为当前的main.o是将我们编写的main.c文件翻译成二进制指令。此时main.o还只是我们整个程序的一部分,因为我们自己写的代码用到了很多别人的代码,比如不是我们自己实现的,声明只放在#中,而实现是在C库函数中,所以最后必须链接起来才可以运行。所以最终的可执行程序除了自己编写的代码之外,还链接了一些会用到的基本代码,库中其实就包含了编译好的.o文件。
4. 链接阶段
(1)逐一合并,调整起始位移和段大小,合并符号表,进行符号解析,为符号分配虚拟地址。
(2)符号重定位。
例子:
使用gcc -o main main.o将汇编阶段生成的main.o文件转换为二进制可执行程序,并用vi打开main文件:
主文件是一个二进制可执行文件:
6. 通用汇编编写方法
1. 两步走
首先通过gcc -c main.c 一步生成.o文件,然后通过gcc -o main main.o 将.o文件转化为可执行文件main,并执行:
2. 一步到位
直接通过gcc -o main main.c 一步生成可执行文件main,执行:
扫一扫在手机端查看
-
Tags : linux编译c程序命令
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。