当前位置: 首页 > article >正文

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


http://www.kler.cn/a/567142.html

相关文章:

  • redis slaveof 命令 执行后为什么需要清库重新同步
  • springboot集成langchain4j-实现简单的智能问答机器人
  • Android逆向:一文掌握 Frida 详细使用
  • SpringBoot 项目集成 Prometheus 和 Grafana
  • JAVA版本GDAL安装使用教程(详细步骤)
  • Lucene硬核解析专题系列(三):查询解析与执行
  • ​CNN神经网络概述
  • Docker项目部署-部署Java应用
  • 半音密码:解码音乐的最小量子单位
  • Vue.js 学习笔记
  • 近似最近邻(ANN)算法库实战
  • 5-1JVM内存区域
  • 高频面试题(含笔试高频算法整理)基本总结回顾48
  • C#上位机--三元运算符
  • 为AI聊天工具添加一个知识系统 之127 详细设计之68 编程 核心技术:Cognitive Protocol Language 之1
  • 【Leetcode 每日一题】131. 分割回文串
  • 1.7 Kaggle大白话:Eedi竞赛Transformer框架解决方案07-调用AI模型输出结果
  • 中科大计算机网络原理 1.5 Internt结构和ISP
  • 【Linux高级IO】Linux多路转接:深入探索poll与epoll的奥秘
  • 自学微信小程序的第六天