[Linux] 编辑器vim、编译器和动静态链接

1. 编辑器vim

编辑器vim用于编辑代码文件,搭建专业的vim开发环境请参考作者此篇文章:

告别默认Vim:Linux下轻松配置Vim开发环境

vim包含12种总模式,常用:

  1. 正常模式:移动光标 / 删除字或行 / 移动复制...
  2. 插入模式:编辑代码
  3. 底行模式:保存和退出 / 文件替换 / 查找 / 列出行号...(偏命令风格

三种模式的切换方式如下图:

基本操作:

  1. 进入vim:vim + 文件名,默认正常模式
  2. 保存文件::w
  3. 退出vim::q(保存并退出:wq

正常模式重点命令集:

  1. 上下左右:kjhl
  2. 删除字符:x
  3. 复制:yw
  4. 替换:r
  5. 撤销和恢复:u和ctrl+r
  6. 跳至指定行首:#G(#为行数

底行模式重点命令集:

  1. 显示行号:set nu
  2. 查找:/ + 字符或? + 字符
  3. 跳到某一行:#(行号

补充知识:

  1. vim + 新文件名::wq会创建新文件,保存并退出;:q退出且不创建文件
  2. 多窗口编辑:vs + 文件名;先退出光标所在终端;切换窗口:ctrl + ww
  3. 打开文件+定位行:vim 文件名 +行号(eg:vim code.cpp +11进入code.cpp且定位第11行
  4. shell功能:!v查询最近的v开头(vim)指令
  5. 视图模式:正常模式ctrl + v进入,支持选区,shift + i可批量添加注释,按esc生效

2. 编译器:gcc / g++

C/C++程序的编译过程:

  1. 预处理(宏替换/去注释/条件编译/头文件展开
  2. 编译(高级语言->汇编语言
  3. 汇编(汇编语言->二进制
  4. 链接(所有.o文件链接为可执行文件

条件编译:

  • 含义:根据预定义条件决定代码的哪一部分参与编译 / 被忽略(编译期静态裁剪
  • 用途:内核源码 / 软件专业度版本 / 应用适配不同平台

C++源码示例:

gcc / g++编译选项:

gcc/g++ [选项] 编译文件 [选项] [目标文件]

编译过程分步骤展示:

step1:创建文件

step2:预处理

-E预处理完成后截停

step3:编译

-S编译完成后截停

step4:汇编

-c汇编完成后截停

step5:链接

step6:运行

补充:

  • 只执行-o会一步到位编译为可执行文件;开发中更常用的是逐个编译-c后再链接-o(编译效率更高
  • Linux的可执行文件可不加后缀,通过权限和内容识别

3. 动静态库和链接方式

一些概念:

  1. 动态库:库文件后缀.so (linux / .dll (windows
  2. 静态库:库文件后缀.a (linux / .lib (windows
  3. 库名:去掉文件前后缀剩下的部分(eg: libc.so,去掉前缀lib,后缀.so,得到库名c

动态/静态链接:

  • 动态链接:运行时跳转到库代码执行库函数
  • 静态链接:链接时拷贝库方法到程序中,脱离静态库独立运行

验证:

创建一个.cpp文件:

编译成可执行程序,可以看到默认是动态链接的,大小为16528字节:

静态链接需要下载静态库和选项-static

编译成可执行程序,可以看到是静态链接且大小为2403984字节:

运行:

总结 :动态链接形成的可执行程序体积更小 / 节省内存和磁盘 / 对库的依赖度大;静态链接相反

感谢阅读,我们下篇见。

相关推荐
人生百态,人生如梦1 小时前
Ubuntu在低版本下使用ccswitch+claudecode(CCSwitch+Docker+Claude)连调教程
linux·ubuntu·docker·claudecode·ccswitch
byte轻骑兵1 小时前
【BlueZ】hciconfig 工具:蓝牙适配器管理实操 + 源码实现基础
linux·bluez·电脑蓝牙·嵌入式蓝牙
SKH.1 小时前
Linux驱动-系统移植
linux·服务器
根目录下的猫1 小时前
虚拟机复制过来运行时:“虚拟机使用的此版本,VMware Workstation 不支持的硬件版本。”错误解决办法,亲测可用
linux·运维·服务器·后端
yunwei372 小时前
eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O
linux·后端·性能优化
帷幕落秋2 小时前
内存、虚拟内存与 OOM
linux·运维
dingdingfish2 小时前
TLPI 第41章 读书笔记:Fundamentals of Shared Libraries
linux·static·link·dynamic·library·tlpi
Apipi*2 小时前
30天速通Linux 第五章Linux 进程管理
linux·运维·服务器
杨云龙UP3 小时前
PostgreSQL 四种常见部署模式快速理解:单实例、流复制、repmgr、Patroni
linux·运维·数据库·postgresql·流复制·高可用ha
流浪0013 小时前
Linux系统篇46——线程(十一) 生产者消费者模型,三种关系和一个交易场所
linux·线程·并发·同步·互斥·阻塞队列·生产者消费者模型