【Linux基础】Linux下的C编程指南

news2025/2/28 13:59:24

目录

一、前言

二、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和其他高级主题的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈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 通过…

智能证件照处理器(深度学习)

功能说明:支持常见证件照尺寸(一寸、二寸、护照等) 智能背景去除(使用深度学习模型)自定义背景颜色选择自动调整尺寸并保持比例实时预览处理效果注意:整合rembg进行抠图,使用Pillow处理图像缩放和背景替换,定义常见证件照尺寸,并提供用户交互选项。首次运行时会自动下…

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。这个操作看似简单,但背后有着重要的安全考虑和技术原…

微信小程序-二维码绘制

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…

Fiddler 的安装与使用

目录 1、Fiddler 的安装2、Fiddler 的使用 1、Fiddler 的安装 通过Fiddler 官网进行下载&#xff08;下载免费的经典版本&#xff09;&#xff0c;填写用途、邮箱、国家信息即可开始下载。 Fiddler 官网下载链接 双击安装包即可进行安装&#xff0c;显示以下界面说明安装成功。…

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统&#xff0c;用于存储和处理大规模数据集。Hadoop 主要由HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce、Yarn&#xff08;Jobtracker&#xff0c;TaskTracker&#xff09;三大核心组件组成。其中HDFS是分布式文件…

清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)

文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章&#xff0c;主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…

Hadoop第2课(伪分布式集群的搭建)

jdk和hadoop安装包&#xff1a; hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下&#xff08;hadoop用户的主目录&#xff09; 2、解压jdk安装包到~目录 卸载jdk的命令&#xff1a;r…

使用Crawlee可破题js渲染采集数据

使用 Crawlee 实现自动化爬虫流程 1. Crawlee 简介 Crawlee 是一个强大的爬虫框架&#xff0c;用于快速构建和维护可靠的爬虫。它支持多种爬虫类型&#xff0c;包括基于 Cheerio 和 Playwright 的爬虫&#xff0c;能够高效处理静态和动态网页。 2. 项目目标 通过自动化脚本实…

Fiddler在Windows下抓包Https

文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量&#xff08;可选&#xff09;解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下&#xff0c;Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密&#xff1a; 1…

Java语法基础知识点1

目录 一、数组 1.1数组的初始化&#xff1a; 1.2数组的遍历方法&#xff1a; 1.3数组的常见使用方法&#xff1a; 二、类和对象 2.1构造方法&#xff1a; 2.2this关键字: 三、封装 3.1访问限定符&#xff1a; 3.2static关键字&#xff1a; 3.3代码块&#xff1a; 一…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面&#xff0c;或者重定向一个通用页面(可能为网站首页)。这时&#xff0c;我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

python-leetcode-分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution:def canPartition(self, nums: List[int]) -> bool:total sum(nums)if total % 2 ! 0:return Falsetarget total // 2dp [False] * (target 1)dp[0] Truefor num in nums:for j in range(tar…

趣讲TCP三次握手

一、TCP三次握手简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中&#xff0c;只有两方进行通信&#xff0c;它使用校验和、确认和重传机制来保证数据的可靠传输。…

基于coze+微信小程序实现图片上传并利用大模型解析

项目截图&#xff1a; 实现代码&#xff08;直接搬去可用&#xff09; 前提&#xff1a;需要填写你的oss配置coze的api授权配置&#xff01;&#xff01;&#xff01; <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…