1. vim内文本编辑器
命令模式 :按下Esc
dd: 删除光标所在行
#dd: 删除光标后#行
yy: 复制光标所在行,p复制以后存储
u : 撤销 ctrk+r:恢复被撤销操作
/关键字: 查找,按下n查看下一个,N 上一个
A: 光标回到行尾 I:光标回调行首 【进行以后变插入模式】
$: 光标回到行尾 0: 光标回调行首 【命令模式不变】
j: 下移
k: 上移
gg: 文件行首
G:文件行尾
gg=G: 自动格式化
按下V 切换为"可视模式",使用 jk-> <- 选中,按d删除
调转至man手册: 光标置于查看函数单词上,使用K调整,指定卷,nK
插入模式:
按键i
底行模式:
退出:按2个Esc
:wq: 保存退出
:q!: 退出不保存
:w : 保存
:100 调到指定行
单行替换:把光标放在需要替换的行上面, 进入底行模式 :s/原数据/新数据
全部替换:底行模式 :%s /原数据/新数据/g
指定行: :29,100s /原数据/新数据/g
:vsp: 竖分屏 :sp 横屏
切换视图:ctrl+w+w
注意: Vim编辑器在编辑文件的时候在该目录下会产生临时文件,编辑的时候操作临时文件,使用ls -a可以查看,
编辑完毕以后把临时文件覆盖本地文件,如果在使用vim的时候直接关闭终端,那么此时系统会锁定文件,
系统不知道是使用本地文件还是临时文件,此时使用rm -rf上传临时文件即可
2.gcc命令:
c编程可执行程序步骤:
预编译->编译->汇编->链接, c语言中已#开头的都是预处理命令
1.预处理:去掉注释、加载头文件、代替宏定义、条件编译生成预编译文件.i结尾
gcc hello.c -E -o hello.i
2.编译: 对c语言进行语法检查,如果有语法错误,报错终止,没有,编译成c独有的汇编代码
gcc hello.i -S -o hello.s
3. 汇编:
gcc hello.s -c -o hello.o
把汇编通过汇编器生成二进制机器语言,给cpu执行文件,已经是二进制不是文本文件
4. 链接
1.比如一个程序1.c 2.c 3.c三个文件构成,汇编以后1.o 2.o 3.o 链接-》hello整体
2.加载静态库(比如从操作系统加载printf)和动态库
gcc hello.o -o hello(生成可执行程序)
gcc参数
-I 目录,指定头文件目录,-I和目录之间没有空格
-Wall 提示更多调试信息
-On n=0-3 编译优化,n越大优化等级越高
-g 包含调试信息,支持gdb调试
-D 程序中动态注册宏
-c 编译,只生产.o文件,不进行链接
-D命令使用:
#include <stdio.h>
#include <stdlib.h>#ifdef HELLO
#define DEBUG 1
#endif
int main(){#ifdef DEBUG
printf("---%s--\n","hello");
#endifreturn 0;
}gcc bb.c -o bb.o -D HELLO // 动态注入宏 HELLO
./bb.o // 输入gcc bb.c -o bb.o -D HELLO
-g 包含调试信息编译的时候
gcc bb.c -o bb.out -g
gdb 命令 : list 列出代码 b 4 在第4行打断点 r 运行 n下一行
3.多文件编译gcc
gcc add.c sub.c main.c -o test -I/home/denganzhi/桌面/20190713code/mutifile
gcc add.c sub.c main.c -o test -I. ==> .当前路径下
会去/usr/include/下找头文件,自己写的,放在当前目录下,编译的时候要使用-I指定头文件路径
4. 静态库、动态库
静态库:在编译过程中载入可执行程序,代码体积大
名称:libxxx.a,改了需要重写编译,编译以后可以把libxxx.a删除
由来:众多.o文件打包.a
动态库:在执行程序中载入内存,编译的时候仅做简单引用,代码体积小
libxx.M.N.so M主版本号N副版本号
windows下.dll
程序运行的时候必须存在
linux下 /usr/lib /lib
由来:动态库、静态库最好理解:
库有 a.c b.c c.c
静态库: 编译的时候把a.c b.c c.c 统一打包,
静态库:使用a.c的时候才去加载, 效率低一些
4.1.静态库:
静态库编译:
1. gcc -O -c add.c sub.c -I.
-O编译优化
-c:预处理、编译、汇编
生成add.o sub.o
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
2. ar -crsv libstatic.a add.o sub.o
生成静态库:libstatic.a
ar -t libstatic.a
查看静态库有哪些.o文件构成
3.使用:
gcc main.c -o main -I. -L. -lstatic
-I: 头文件路径
-L: 库文件路径
-l:库文件名称,除了"lib" 和 ".a" 的部分
4. 使用
./main
头文件"" : 在.c 当前目录下查找
和 <> 区别: 编译指定 CFLAGS = -Werror -I. 目录下找头文件
#CFLAGS = -Werror -I.
# 头文件放入 inc 中, 代码中直接 #include <add.h>
CFLAGS = -Werror -Iinc
test: add.o sub.o main.o
gcc -o test $^
%.o:%.c
gcc $(CFLAGS) -c -o $@ $<
.PHONY:clean
clean:
rm *.o test
4.2 动态库:
静态库:对空间要求较低,对时间要求比较高
动态库:对时间要求低,对空间要求高, 用到时候在去加载,需要时间的
1. gcc -fPIC -Wall -c sub.c add.c -I. 生成.o
-fPIC: 告诉编译器产生与位置无关代码,产生的代码中,没有绝对地址,全部相对地址
-Wall:生成警告
2.gcc -shared -o libsy.so sub.o add.o 生成动态库
一步完成:
gcc -O -fPIC -shared -o libsy.so sub.c add.c -I.
3.gcc main.c -o main -I. -L. -lsy : 生成可执行程序
程序运行:/usr/lib /lib去找:
1. 把动态库放入/usr/lib下 也有可能放在 /usr/local/lib/目录下,头文件在/usr/include/下
sudo cp libsy.so /usr/lib/
2. 方法2:改配置文件
su root
/etc/ld.so.conf.d
touch mylib.conf
写入库文件路径:/home/denganzhi/mutifile/
ldconfig: 更新ld.so.cache文件
./main即可
3. 环境变量:
export LD_LIBRARY_PATH=/home/denganzhi/mutifile/
./main
环境变量:
export只对当前shell有效
写在 ~/.bashrc 对当前用户有效
写在 /etc/bash.bashrc 对所有用户有效,当打开shell读取该文件
/etc/profile:用户登录时读取,修改了使用source /etc/profile生效
原因:系统加载代码的时候,是知道动态库的名字的
会去环境变量下,/etc/ld.so.conf.d下,找动态库/usr/lib下、\lib
file a.out: 查看是否链接动态库
ldd a.out: 查看链接哪些动态库
上面例子使用源码:
add.c
#include <my.h>
int add(int a,int b){
return a+b;
}
my.h
#ifndef _MY_H
#define _MY_H
extern int add(int a,int b);
extern int sub(int a,int b);
#endif
sub.c
#include <my.h>
int sub(int a,int b){
return a-b;
}
main.c
#include <stdio.h>
#include "my.h"
int main(int argc,char *args[]){
printf("add--%d\n",add(4,5));
printf("sub--%d\n",sub(5,4));
return 0;
}