【Linux基础】Linux下的C编程指南
目录
一、前言
二、Vim的使用
2.1 普通模式
2.2 插入模式
2.3 命令行模式
2.4 可视模式
三、GCC编译器
3.1 预处理阶段
3.2 编译阶段
3.3 汇编阶段
3.4 链接阶段
3.5 静态库和动态库
四、Gdb调试器
五、总结
一、前言
在Linux环境下使用C语言进行编程是一项基础且重要的技能。本文将详细介绍在Linux下使用C语言编程的完整流程,包括代码编辑(使用vim)、编译(使用gcc)、调试(使用gdb)。对于大型项目,手动编译每个文件会非常繁琐,因此我们还需要使用Makefile进行项目管理。本文将重点讲解vim、gcc和gdb的使用,后续会专门更新一篇关于Makefile的文章。
二、Vim的使用
Vim是一款功能强大的模态编辑器,广泛应用于Linux、Unix、MacOS和Windows等操作系统。它具有四种模式:普通模式、插入模式、命令行模式和可视模式。用户可以通过配置文件(.vimrc)对Vim进行个性化定制。
2.1 普通模式
普通模式是Vim的默认模式,键盘按键被解释为命令。以下是一些常用快捷键:
| 功能键 | 说明 |
| i | 切换到插入模式,光标在所在位置的前面 |
| I(大i) | 切换到出入模式,光标跑到行首 |
| o(小o) | 切换到插入模式,在原来这行的下面新建一行 |
| O(大o) | 切换到插入模式,在原来这行的上面新建一行 |
| a | 切换到插入模式,光标在所在位置的后面 |
| A | 切换到出入模式,光标跑到行尾 |
| G | 移动到文件结尾 |
| gg | 移动到文件开头 |
| dd | 删除本行 |
| yy | 复制本行 |
| u | 撤销上一次操作 |
| p | 粘贴 |
2.2 插入模式
| 功能键 | 说明 |
| ESC | 返回到普通模式 |
2.3 命令行模式
通过在普通模式下按下 : 键(英文的冒号)进入命令行模式。
| 功能键 | 说明 |
| w | 保存 |
| q | 退出 |
| q! | 强制退出 |
| wq | 保存并退出 |
| w filename | 另存一个名为filename的文件 |
| set nu | 显示行号 |
2.4 可视模式
可视模式用于选择文本。用户可以通过在普通模式下按v键进入普通可视模式,按V键进入行可视模式,按Ctrl + v键进入块可视模式。
不过我平时不怎么用这个模式,所以这部分你们可以看看其他博主的文章。
三、GCC编译器
GCC(GNU Compiler Collection)是Linux下常用的C语言编译器。编译过程分为四个阶段:预处理、编译、汇编和链接。
3.1 预处理阶段
预处理阶段处理源代码中的预处理指令(如#include、#define等)。可以使用-E选项查看预处理结果:
gcc –E hello.c –o hello.i
3.2 编译阶段
编译阶段检查代码的语法和规范,并将代码翻译成汇编语言。可以使用-S选项查看汇编代码:
gcc –S hello.i –o hello.s
3.3 汇编阶段
汇编阶段是把编译阶段生成的“.s”文件转成目标文件,可使用选项“-c”就可。
gcc –c hello.s –o hello.o
3.4 链接阶段
链接阶段将目标文件与库文件链接,生成可执行文件。可以使用以下命令完成链接:
gcc hello.o -o hello
查看该二进制文件依赖的库:
ldd hello

- linux-vdso.so.1:虚拟动态共享对象(Virtual Dynamic Shared Object),它是 Linux 内核提供的一种机制,用于优化某些系统调用的性能。
- libc.so.6:GNU C 标准库(GNU C Library)的动态链接库文件。
- /lib64/ld-linux-x86-64.so.2:动态链接器(Dynamic Linker),也称为加载器(Loader)。它的作用是负责加载可执行文件及其依赖的共享库,并在程序运行时解析符号。
gcc编译器选项表
| 后缀名 | 功能 |
| -c | 只编译不链接,生成目标文件“.o” |
| -S | 只编译不汇编,生成汇编代码 |
| -E | 只预编译,不做其他处理 |
| -g | 在可执行程序中包含标准调试信息 |
| -o file | 把输出文件输出到file里 |
| -v | 打印出编译器内部编译过程的命令行信息和编译器的版本 |
| -I dir | 在头文件的搜索路径列表中添加dir目录 |
| -L dir | 在库文件的搜索路径列表中添加dir目录 |
| -static | 链接静态库 |
| -llibrary | 链接名为library的库文件 |
-I dir
“-I dir”选项可以在头文件的搜索路径列表中添加 dir目录。由于Linux中头文件都默认放到“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-Idir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。
-L dir
选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加 dir目录。
例如有程序 hello.c 需要用到目录“/root/workplace/Gcc/lib”下的一个动态库 libyourname.so,则只需键入如下命令即可:
gcc hello.c –L= /root/workplace/Gcc/lib –lyourname –o hello
需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。
另外值得详细解释一下的是“-l”选项,它指示 Gcc 去连接库文件 libyourname.so。由于在 Linux下的库文件命名时有一个规定:必须以 “lib” 3 个字母开头。因此在用-l 选项指定链接的库文件名时可以省去 l、i、b 3 个字母。也就是说 Gcc 在对“-lyourname”进行处理时,会自动去链接名为 libyourname.so 的文件。
警告和错误选项
| 选项 | 含义 |
| -ansi | 支持符合ANSI标准的c程序 |
| -pedantic | 允许发出ANSI C标准所列的全部警告信息 |
| -pedantic-error | 允许发出ANSI C标准所列的全部错误信息 |
| -w | 关闭所有警告 |
| -Wall | 允许发出Gcc提供的所有有用的报警信息 |
| -werror | 把所有的警告信息转化为错误信息,并在警告发生时终止编译过程 |
| -On | 对代码进行优化,n=0~2 数字越大,优化等级越高 |
3.5 静态库和动态库
- 静态库:编译链接时将库文件的代码全部加入到可执行文件中,文件后缀为.a。使用静态库的程序在运行时不再需要库文件。
- 动态库:编译链接时不将库文件的代码加入到可执行文件中,而是在程序运行时由运行时链接器加载库文件,文件后缀为.so。使用动态库可以节省系统开销。
四、Gdb调试器
Gdb 调试器是一款 GNU开发组织并发布的UNIX/Linux下的程序调试工具。
使用c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb无法载入该可执行文件。
步骤1 增加调试信息
gcc -g test.c -o test
步骤2 进入调试模式
gdb test
| 命令 | 功能 |
| l(list) | 查看文件 |
| b(break) n | 在第n行设置断点 |
| delete n | 删除断点n |
| info b | 查看断点情况 |
| disable/enable n | 不使能/使能断点n |
| r(run) | 运行代码 |
| p(print) n | 查看变量n的值 |
| n(next) | 单步运行(不会进入函数) |
| s(step) | 单步运行(会进入函数) |
| c(continue) | 恢复正常执行(遇断点停) |
| finish | 恢复正常执行(遇断点不停) |
| help | 帮助信息 |
| q(quit) | 退出调试 |
五、总结
本文详细介绍了在Linux环境下使用C语言编程的完整流程,包括使用Vim进行代码编辑、使用GCC进行编译和链接、使用GDB进行调试。通过这些工具,开发者可以高效地进行C语言编程和调试。希望本文对您有所帮助,后续会继续更新关于Makefile和其他高级主题的文章。
相关文章:
【Linux基础】Linux下的C编程指南
目录 一、前言 二、Vim的使用 2.1 普通模式 2.2 插入模式 2.3 命令行模式 2.4 可视模式 三、GCC编译器 3.1 预处理阶段 3.2 编译阶段 3.3 汇编阶段 3.4 链接阶段 3.5 静态库和动态库 四、Gdb调试器 五、总结 一、前言 在Linux环境下使用C语言进行编程是一项基础且…...
DeepSeek-OpenSourceWeek-第四天-Optimized Parallelism Strategies
DeepSeek 在 #OpenSourceWeek(开源周) 的第四天推出了两项新工具,旨在让深度学习更快、更高效:**DualPipe** 和 **EPLB**。 DualPipe 定义:DualPipe 是一种用于 V3/R1 训练中计算与通信重叠的双向pipline并行算法。 作用:它通过实现前向和后向计算-通信阶段的完全重叠,减…...
Python Cookbook-2.15 用类文件对象适配真实文件对象
任务 需要传递一个类似文件的对象(比如,调用urllib.urlopen 返回的结果)给一个函数或者方法,但这个函数或方法要求只接受真实的文件对象(比如,像marshalload 这样的函数)。 解决方案 为了过类型检查这一关,我们需要将类文件对象…...
浅谈HTTP及HTTPS协议
1.什么是HTTP? HTTP全称是超文本传输协议,是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…...
Pytest自定义测试用例执行顺序
文章目录 1.前言2.pytest默认执行顺序3.pytest自定义执行顺序 1.前言 在pytest中,我们可能需要自定义测试用例的执行顺序,例如登陆前需要先注册,这个时候就需要先执行注册的测试用例再执行登录的测试用例。 本文主要讲解pytest的默认执行顺序…...
人大金仓KCA | 用户与角色
人大金仓KCA | 用户与角色 一、知识预备1. 用户和角色 二、具体实施1. 用户管理-命令行1.1 创建和修改用户1.2 修改用户密码1.3 修改用户的并发连接数1.4 修改用户的密码有效期 2.用户管理-EasyKStudio2.1 创建和修改用户2.2 修改用户密码2.3 修改用户的并发连接数2.4 修改用户…...
【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者数据湖,基本上绕不开一个架构“Medallion”, 它使得数据管理更为简单有效。ADB 通过…...
什么是Ollama?什么是GGUF?二者之间有什么关系?
一、Ollama:本地化大模型运行框架 Ollama 是一款开源工具,专注于在本地环境中快速部署和运行大型语言模型(LLM)。它通过极简的命令行操作简化了模型管理流程,支持离线运行、多模型并行、私有化部署等场景。 核心特性 本地化运行:无需依赖云端API,用户可在个人电脑或服务…...
智能证件照处理器(深度学习)
功能说明:支持常见证件照尺寸(一寸、二寸、护照等) 智能背景去除(使用深度学习模型)自定义背景颜色选择自动调整尺寸并保持比例实时预览处理效果注意:整合rembg进行抠图,使用Pillow处理图像缩放和背景替换,定义常见证件照尺寸,并提供用户交互选项。首次运行时会自动下…...
【软考】【2025年系统分析师拿证之路】【啃书】第十五章 系统运行与维护(十六)
目录 运维技术指标系统运行管理系统用户管理网络资源管理软件资源管理 系统故障管理软件系统维护系统评价遗留系统处理遗留系统的评价遗留系统的演化 新旧系统转换数据转换和迁移 现有系统演进 运维技术指标 平均故障修复时间(MTTR)平均应答时间&#x…...
C++-第十三章:红黑树
目录 第一节:红黑树的特征 第二节:实现思路 2-1.插入 2-1-1.unc为红 2-1-2.cur为par的左子树,且par为gra的左子树(cur在最左边) 2-1-2-1.unc不存在 2-1-2-2.unc为黑 2-1-3.cur为par的右子树,且par为gra的右子树(cur在最右侧) 2-…...
推荐3个背景渐变色的wordpress主题
干净、清爽、背景渐变色的wordpress企业主题 服务类公司wordpress企业主题https://www.jianzhanpress.com/?p8255 红色大气的wordpress企业主题,适合服务行业的公司搭建企业官方网站使用。 wordpress询盘型独立站主题https://www.jianzhanpress.com/?p8258…...
Scrapy:隧道代理中移除 Proxy-Authorization 的原理解析
隧道代理中移除 Proxy-Authorization 的原理解析 背景 在 Scrapy 的 HTTP 下载处理中,当使用隧道代理(TunnelingAgent)时,会移除请求头中的 Proxy-Authorization。这个操作看似简单,但背后有着重要的安全考虑和技术原…...
Qt for Android下QMessageBox背景黑色、文字点击闪烁
最近在基于Qt开发安卓应用的时候,在红米平板上默认QMessageBox出现之后,背景黑色,并且点击提示文字会出现闪烁,影响用户体验。 问题分析 1、设置QMessageBox样式,设置背景色、文字颜色,如下所示: QMessageBox {background: white;color: white; } 尝试之后,问题仍存…...
Docker数据卷操作实战
什么是数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷 可以在容器之间共享和享用对 数据卷 的修改立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即时容器被…...
nginx 动态计算拦截非法访问ip
需求:在Nginx上实现一个动态拦截IP的方法,具体是当某个IP在1分钟内访问超过60次时,将其加入Redis并拦截,拦截时间默认1天。 技术选型:使用NginxLuaRedis的方法。这种方案通过Lua脚本在Nginx处理请求时检查Redis中的黑…...
微信小程序-二维码绘制
wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…...
Node.js与MySQL的深入探讨
Node.js与MySQL的深入探讨 引言 Node.js,一个基于Chrome V8引擎的JavaScript运行时环境,以其非阻塞、事件驱动的方式在服务器端应用中占据了一席之地。MySQL,作为一款广泛使用的开源关系型数据库管理系统,凭借其稳定性和高效性,成为了许多应用的数据库选择。本文将深入探…...
【10】RUST的迭代器与闭包
文章目录 闭包(Closures)定义捕获方式:迭代器(Iterator)核心方法:创建方式:适配器(Adapter)常见适配器及示例消费方法(Consumer)所有权与引用处理性能与惰性求值闭包(Closures) 类比C++里的lambda表达式 闭包是能够捕获其所在环境变量的匿名函数,支持灵活的类型推…...
Fiddler 的安装与使用
目录 1、Fiddler 的安装2、Fiddler 的使用 1、Fiddler 的安装 通过Fiddler 官网进行下载(下载免费的经典版本),填写用途、邮箱、国家信息即可开始下载。 Fiddler 官网下载链接 双击安装包即可进行安装,显示以下界面说明安装成功。…...
Hadoop架构详解
Hadoop 是一个开源的分布式计算系统,用于存储和处理大规模数据集。Hadoop 主要由HDFS(Hadoop Distributed File System)、MapReduce、Yarn(Jobtracker,TaskTracker)三大核心组件组成。其中HDFS是分布式文件…...
清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)
文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章,主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…...
Hadoop第2课(伪分布式集群的搭建)
jdk和hadoop安装包: hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下(hadoop用户的主目录) 2、解压jdk安装包到~目录 卸载jdk的命令:r…...
DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?
一、引言:MoE模型的通信瓶颈与DeepEP的诞生 在混合专家(MoE)模型训练中,专家间的全对全(All-to-All)通信成为性能瓶颈。传统方案在跨节点传输时带宽利用率不足50%,延迟高达300μs以上。DeepSee…...
IoT 测试:智能互联时代的质量保障
一、IoT(物联网)概述 物联网(Internet of Things, IoT)指的是将各种设备、传感器和系统连接到互联网,实现数据采集、传输、处理和智能化应用。随着 5G、云计算、人工智能等技术的发展,IoT 在智能家居、工业自动化、医疗健康、智能交通等领域的应用日益广…...
使用Crawlee可破题js渲染采集数据
使用 Crawlee 实现自动化爬虫流程 1. Crawlee 简介 Crawlee 是一个强大的爬虫框架,用于快速构建和维护可靠的爬虫。它支持多种爬虫类型,包括基于 Cheerio 和 Playwright 的爬虫,能够高效处理静态和动态网页。 2. 项目目标 通过自动化脚本实…...
短连接服务器压测-wrk
背景 由于业务需要我们从原来的 长连接 转为 短连接,提高单服同时在线人数。 老压测 在服务器编写机器人,编写一部分客户端逻辑(这里如果客户端严格使用mvc 模式,其实可以把 view 层换为 服务器测试代码层,而一般不…...
DAV_postgresql_2-user_role
数据库角色用来管理数据库访问权限,简化权限的管理 用户和角色在整个数据库集簇中是全局性的,不是针对某个单一数据库,只要有足够的权限,用户可以访问所有数据库的对象。 数据库用户可以分为两类 超级用户 -- postgres 普通…...
php 获取head参数
php 获取head参数 在PHP中,获取HTTP头部(head)参数可以通过不同的方式实现,下面为你详细介绍几种常见的方法。 1. 使用$_SERVER超全局变量 $_SERVER 是PHP中的一个超全局变量,它包含了诸如头信息、路径、脚本位置等…...
Fiddler在Windows下抓包Https
文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量(可选)解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下,Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密: 1…...
