《Linux系统编程笔记》----DAY01

VIM基本操作

跳转

  • 跳转到指定行:

    • 1.88G(命令模式)
    • 2.:88(末行模式)
  • 跳转到文件首

​ gg(命令模式)

  • 跳转文件尾

    • G(命令模式)
  • 光标移至行首:

    • 0(命令模式)
  • 光标移至行尾:

    • $(命令模式)
  • 自动格式化程序

    • gg=G
  • 大括号对应

    • %(命令模式)
  • 跳转至man手册:

​ 将光标置于待查看函数单词上,用NK(N是第几卷)

  • 查看宏定义:

    ​ 将光标置于待查看宏定义单词上,[d查看定义语句

删除/替换

  • 删除一个字符

    • x(命令模式)
  • 删除一个单词

    • dw(命令模式)光标要放在首字母
  • 删除光标至行尾

    • D(命令模式)或者d+$
  • 删除光标至行首

    • d0(命令模式)

    删除指定区域:

    ​ 按v(命令模式)切换为“可视模式”,选中要删除的区域,按d删除

    删除指定一行

    ​ 在光标所在行,按dd

    删除多行

    ​ Ndd

复制粘贴

复制一行

​ yy(命令模式)

​ p粘贴(光标所在下一行)

​ P(粘贴)(光标所在上一行)

查找和替换

  • 1.找设想的内容

​ 末行模式下按“/”输入要查找的单词 回车 n下一个

  • 2.找看到的内容

​ 命令模式下,将光标置于单词任意一个字符上,按“*”或"#"

  • 3.替换

  • 替换单个字符 ----r(命令模式)

    • -​ 3.1单行 末行模式,按 s /要替换的内容 /待替换的内容

    • -​ 3.2区域替换 末行模式,起始行号,终止行号 /要替换的内容 /待替换的内容/g

    • -​ 3.3通篇 末行模式 ,按%s /要替换的内容 /待替换的内容/g ,g不加,就是替换第一个

  • 撤销 u

  • 反撤销 ctrl+r

  • 显式行号 :set number

末行模式 sp +回车(横屏) 切屏:ctrl+ww

末行模式 vsp+回车(竖屏) 切屏:ctrl+ww

在末行模式下执行shell命令

​ :!命令 :!ls-l



gcc相关

gcc编译可执行程序四步骤

1.预处理(gcc -E):展开宏,头文件,替换条件编译,删除注释,空行,空白

2.编译(gcc -S):检查语法规范【消耗时间,系统资源最多】

3.汇编(gcc -c):将汇编指令翻译成机器指令

4.链接(无参数):数据段合并,地址回填

hello.c---预处理-->hello.i----编译---->hello.s-----汇编------>hello.o-----链接------>a.out

gcc常用参数

-I 指定头文件所在目录位置

-c 只做预处理,编译,汇编。得到 二进制文件!(.o文件)

-g 编译时添加调试文件。主要支持gdb调试

-On n=0~3;编译优化,优化等级(默认2级),n越大优化越多

-Wall 显式所有警告信息

-D 向程序中,“动态”注册宏定义

-L 指定库位置

静态库和共享库

​ 静态库:对空间要求较低,而时间要求较高

​ 共享库:对空间要求较高,而时间要求较低

制作静态库

1.将 .c生成 .o文件

gcc -c add.c -o add.o

2.使用ar工具生成静态库

ar	rcs	libmylib.a	file1.o

3.编译静态库到可执行文件中

​ gcc test.c lib库名.a -o a.out

制作动态库

1.将.c生成.o文件(生成与位置无关的代码 -fPIC)

​ gcc -c add.c -o add.o -fPIC

​ 2.使用 gcc -shared 制作动态库(.so文件)

​ gcc -shared -o lib库名.so add.o sub.o

​ 3.编译可执行程序时,指定所使用的动态库。-l:指定库名(去掉lib前缀和.so后缀),-L:指定库路径

​ gcc test.c -o a.out -l mymath -L ./lib

​ 4.运行可执行程序 ./a.out出错

*​ 原因:

​ 链接器 工作于链接阶段,工作时需要 -l和-L

​ 动态链接器 工作于层序运行阶段,工作时需要提供动态库所在目录位置

​ 【1】通过环境变量改变:export LD_LIBRARY_PATH=动态库路径

​ 【2】永久生效:写入 终端配置文件。 .bashrc

​ 1)vi ~./bashrc

​ 2)写入export LD_LIBRARY_PATH=动态库路径

​ 3). .bashrc/ source .bashrc /重启 终端----->让修改后的.bashrc生效 *

​ 【3】修改/etc/ld.so.conf

​ 1.sudo vi /etc/ld.so.conf

​ 2.添加你的共享库路径

​ 3.更新查找共享库的路径

​ sudo ldconfig -v

​ 4.测试程序可否找到共享库

​ ldd a.out

扩展——数据段合并(链接时合并)
【好像我记得上面的步骤有问题,下次使用记得的再补充】

gdb调式工具

-g :使用该参数编译可执行文件,得到调试表

​ gdb a.out
​ list:list 1 列出源码。根据源码指定 行号设置断点

​ b: b 20 在20行设置断点

​ r: 运行程序

​ n: 下一条指令(会越过函数)

​ s: 下一条指令(会进入函数)

​ p: 查看变量的值

​ continue:继续执行断点后续指令

​ quit:退出gdb当前调试

​ finish:结束当前函数调用

gdb其他指令

出现段错误,解决方法:

​ run:使用run查找段错误位置

​ set args:设置main函数命令行参数

​ run 字串1 字串2 ...:设置main函数命令行参数

​ info b:查看断点信息表

​ b 20 if i=5:设置条件断点

​ ptype:查看变量类型

​ bt:列出当前程序正存活着的栈帧(形参和局部变量都在栈帧上)

​ frame:根据栈帧编号进行切换

​ display:跟踪变量值,undisplay 取消跟踪

set follow-fork-mode child	命令设置gdb在fork之后跟踪进程
set follow-fork-mode parent	设置跟踪父进程

makefile项目管理

命名:makefile	Makefile	------make命令

1个规则

目标:依赖条件
	(一个tab缩进)命令
  • 目标的时间必须晚于依赖条件的时间,否则,更新目标

  • 依赖条件如果不存在,找寻新的规则去产生依赖

ALL:指定makefile的终极目标

2个函数:

​ src=$(wildcard *.c)

​ 找到当前目录下所有后缀为.c的文件,赋值给src(src=add.c sub.c div.c)

obj=$(patsubst %.c,%.o,$(src))

​ 将参数3中,包含参数1的部分,替换为参数2(obj=add.o sub.o div.o)

​ clean:(没有依赖)

-rm -rf $(obj) a.out “-”作用是:删除不存在文件时,不报错。顺序执行结束

3个自动变量

​ $@:在规则的命令中,表示规则中的目标

​ $<:在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖一次取出,套用模式规则

​ $^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的规则消除重复项

​ 模式规则:

​ %.o:%.c

​ gcc -c $< -o $@

​ 静态模式规则:

​ $(obj):%.o:%.c

​ 伪目标:

​ .PHONY:clean All
​ 参数:

​ -n : 模拟执行make,make clean命令

​ -f: 指定文件执行make命令

原文地址:https://www.cnblogs.com/hongweijiang/p/14514046.html