vim gcc 静态库 动态库

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");
#endif

    return 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;
  
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值