Linux系统上C程序的编译与调试

这篇具有很好参考价值的文章主要介绍了Linux系统上C程序的编译与调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、环境配置

在Linux操作系统(ubuntu)中,打开终端,以管理员root模式登录
1.更新:输入命令apt update
2.下载vim:输入命令apt install vim -y
3.下载gcc:输入命令apt install gcc -y
4.下载g++:输入命令apt install g++ -y
5.下载make:输入命令apt install make -y
安装成功:
linux编译c文件,Linux,linux,c语言,运维

二、建立c程序

【例1】输出Hello word!

1.先在进入自己要建立文件的目录,然后建立一个.c文件:

比如说,这里建立一个main.c文件

linux编译c文件,Linux,linux,c语言,运维
2.通过vi,打开main.c文件vi main.c

linux编译c文件,Linux,linux,c语言,运维
(1)进入vi,此时处于命令模式,命令模式,不可以进行一般输入操作。
linux编译c文件,Linux,linux,c语言,运维

(2)输入i进入插入模式

示例:

linux编译c文件,Linux,linux,c语言,运维

处于插入模式时,可以进行输入操作:

linux编译c文件,Linux,linux,c语言,运维

输入完成之后,按Esc返回命令模式:

linux编译c文件,Linux,linux,c语言,运维

(3)输入进入末行模式:

linux编译c文件,Linux,linux,c语言,运维

(4)输入wq,按回车保存退出:

linux编译c文件,Linux,linux,c语言,运维
linux编译c文件,Linux,linux,c语言,运维

三、编译C程序

当在main.c中写入一段代码之后,在终端输入gcc -o main main.c去编译main.c文件:

linux编译c文件,Linux,linux,c语言,运维
这时,可以看到在当前目录下,生成了一个可执行程序main,当我们用ls -l去查看的时候,发现这个生成的文件具有可执行权限,也就是说它可以运行。

四、执行C程序

输入可执行程序的路径就可以执行所要执行的C程序:
linux编译c文件,Linux,linux,c语言,运维

相当于:
linux编译c文件,Linux,linux,c语言,运维

五、c程序的编译链接过程

c语言的源程序的后缀必须为.c,源文件是在硬盘上存放着它可以持久存储。C语言.c程序是无法直接执行的,必须要经过编译链接生成一个能够在计算机上执行的二进制可执行程序,这样才能运行这个二进制可执行程序。可以通过gcc -o main main.c将无法执行的.c程序转换为可执行的二进制程序main。

程序编译的过程分为4步:预编译、编译、汇编和链接。通过这四步将高级语言翻译成机器指令(二进制),在计算机上可以直接执行的就是最终的二进制机器指令。
linux编译c文件,Linux,linux,c语言,运维

【例】进入vi写一个初始化数组的C语言代码并保存

linux编译c文件,Linux,linux,c语言,运维

1.预编译阶段

(1)删除所有的“#define”,并且展开所有的宏定义;
(2)处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
(3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
(4)删除所有的注释;
(5)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
(6)保留所有的#pragma编译器指令,因为编译器需要使用它们。

示例:

在删除main文件之后,预编译当前的main.c文件,通过gcc -E main.c -o main.i预编译main.c文件并显示结果,可以看到main.i文件被生成了:

linux编译c文件,Linux,linux,c语言,运维

通过vi打开这个main.i文件:

linux编译c文件,Linux,linux,c语言,运维
linux编译c文件,Linux,linux,c语言,运维

可以看到include文件被全部展开,宏被也被展开,注释也被删除了

2.编译阶段

词法分析、语法分析、语义分析,代码优化,汇总符号。

示例:

通过gcc -S main.i -o main.s,将预编译生成的文件main.i转换为编译完成的文件main.s,并用vi打开这个main.s文件:

linux编译c文件,Linux,linux,c语言,运维

main.s文件中都是汇编代码:

linux编译c文件,Linux,linux,c语言,运维

3.汇编阶段

将汇编指令翻译成二进制格式,生成各个section,生成符号表。

示例:

通过gcc -c main.s -o main.o,将编译阶段生成的文件main.s转换为汇编完成的二进制机器指令main.o,并用vi打开这个main.o文件:
linux编译c文件,Linux,linux,c语言,运维
main.o文件是二进制机器指令:
linux编译c文件,Linux,linux,c语言,运维
上图中的ELF是该文件的格式。

main.o虽然是二进制指令文件,但是不可以执行,因为当前的main.o是把我们自己写的main.c文件翻译成了二进制的指令,main.o此时只是我们整个程序的一部分,因为我们自己写的代码用到了别人的许多代码,比如说priintf,是我们没有自己实现的,#include<stdio.h>中只是放了printf的声明,printf的实现是在C的库函数中,所以最后要将它链接过来,才可以运行起来。因此,最终的可执行程序除了自己已经写的代码以外,还链接了一些都会用到的基础代码。库里边放的其实就是已经编译好的.o文件。

4.链接阶段

(1)合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址 .
(2)符号重定位 。

示例:

通过gcc -o main main.o,将汇编阶段生成的文件main.o转换二进制可执行程序,并用vi打开这个main文件:

linux编译c文件,Linux,linux,c语言,运维

main文件是二进制可执行文件:

linux编译c文件,Linux,linux,c语言,运维

六、一般的编译写法

1.两步走

先通过gcc -c main.c一步生成.o文件,然后再通过gcc -o main main.o.o文件转换为可执行文件main,并执行它:

linux编译c文件,Linux,linux,c语言,运维

2.一步走

直接通过gcc -o main main.c一步生成可执行文件main,并执行:

linux编译c文件,Linux,linux,c语言,运维文章来源地址https://www.toymoban.com/news/detail-728464.html

到了这里,关于Linux系统上C程序的编译与调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM架构Linux操作系统上C语言版本的CycloneDDS中HelloWorld的编译过程(交叉编译工具链)

    ARM架构Linux操作系统上C语言版本的 CycloneDDS 中 HelloWorld 的编译过程与源码编译过程中的 roundtrip 示例编译是一样的,因为实在ARM架构上,所以需要将 idlc_generat e注释掉,自己手动添加源代码和头文件,之后在进行 cmake 和 make 操作

    2024年02月15日
    浏览(30)
  • 【linux】2 Linux编译器-gcc/g++和Linux调试器-gdb

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" 程序(文本)——机器语言(二进制) 预处理 (进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 连接(生成可执行文件或库文件) 为什么计算机只认识二进制? 组成计算机的各种组件只认识二进制

    2024年02月11日
    浏览(29)
  • linux下can调试工具canutils编译安装

    命令安装只需要 sudo apt-get install canutils 一、下载源码 下载canutils和libsocketcan libsocketcan地址:https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2 #0.0.11版本 canutils地址:https://public.pengutronix.de/software/socket-can/canutils/v4.0/canutils-4.0.6.tar.bz2 #4.0.6版本 解压如下: tar -jxvf l

    2024年01月23日
    浏览(28)
  • linux | vscode | makefile | c++编译和调试

    简单介绍环境: vscode 、centos、 gcc、g++、makefile 简单来说就是,写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程,以及官网也看了很多次,最后自己一点多一点摸索,有的些许收获。 首

    2024年02月15日
    浏览(24)
  • MacOs使用VS Code编译调试C语言程序

    参考博客:Windows/macOS使用VSCode搭建C/C++的开发/Debug环境 在微软官方下载适合macOS版本的VS Code。 C/C++ C/C++ Extension Pack (扩展包里内含有C/C++、C/C++ Themes、CMake Tools和CMake,也一起装了) Chinese(Simplified) 中文汉化包 Code Runner(运行代码) 安装好Code Runner后要记得在它的拓展设置里

    2024年02月09日
    浏览(34)
  • 《Linux运维篇:Linux系统运维指南》

    《Linux运维总结:Ubuntu20.04+Ubuntu22.04配置静态固定IP地址》 《Linux运维总结:使用U盘制作Linux镜像》 《Linux运维实战:不重启识别新挂载磁盘》 《Linux运维实战:使用parted进行磁盘分区》 《Linux运维实战:fdisk和parted一键分盘格式化分区》 《Linux运维实战:Centos7.9系统实现在线

    2023年04月24日
    浏览(49)
  • 在Linux系统中运行C语言程序

    正式学习c语言的第一天   2022/1/10 在之前的学习中已经在Windows系统中用Microsoft VC++上实现了C语言程序的运行,现在将在Linux系统上运行C语言程序。 首先明确C语言程序开发的4个步骤:编辑、编译、链接、运行 在Microsoft VC++中编译和运行都可以直接用鼠标或按键快捷运行,L

    2024年02月03日
    浏览(20)
  • 如何在linux(ubantu)操作系统运行c语言文件

    关于linux的其他文章: ​1.linux命令、vi命令、vim命令、shell语法(完整详细) 2.linux(ubantu)系统如何安装vim编辑器以及如何使用vim 3.如何在linux(ubantu)操作系统运行c语言文件 4.如何在Linux(ubantu)系统通过c程序将文档1指定内容替换到文档2的指定内容 5.如何在Linux(ubantu)系统

    2023年04月08日
    浏览(32)
  • Ceph入门到精通-Linux下Ceph源码编译和GDB调试

    Ceph版本:14.2.22 Linux版本:ubuntu-server 18.04     Ceph源码是托管在Github上,由于某些原因,国内访问Github网站很慢,所以需要从其他途径加速获取源码。Github官方给出了几个Github的镜像网站: https://github.com.cnpmjs.org/ https://hub.fastgit.org/ 本地需要修改~/.gitconfig文件,才可以从上面

    2024年02月12日
    浏览(23)
  • 【运维】Linux 跨服务器复制文件文件夹

    如果是云服务 建议用内网ip scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包