LInux(gcc处理器,库文件,动静态库)

//Dbug版本为可调试版本 生成的可执行的文件在包含调试信息

//Release版本为用户版本 无可调试信息 用gcc生成的就是Release版本

//用gcc生成的就是Release版本 + -g 可以变成Dbug版本 //e.g gcc 1.c -o 1 -g

// 变成Dbug版本后 输入gdb 文件名 进入调试模式

// 在完成调试后,需要重新编译调试后的代码 e.g gcc 1.c -0 1 可以应用的代码如下

//l //显示main函数所在的文件的源代码

//2 list 文件名 : num//显示filename文件num行上下的源代码2.

//3 b 行号 //给指定行添加断点

//4 b 函数名 //给指点函数的第一有效行添加一个断点.

//5 info break //显示断点信息。

//6 delete 断点号 //删除指定断点

//7 disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效

//8 enable 断点号//将断点设定为有效的,不加断点号,将所有断点设置为有效

//9 r //运行程序

//10. n(next)//单步执行

//11 c (continue)//继续执行,直接执行到下一个断点处

//12 s //进入将要被调用的函数中执行

//13 finish //跳出函数

//14 q //退出调试

//15 p val //打印变量val的值

//16 p & val //打印变量val的地址

//17 p a + b ////打印表达式的值

//18 p arr(数组名)打印数组所有元素的值

//19 p * parr@len//用指向数组的指针打印数组所有元素的值

//20 display//自动显示,参数和p命令一样

//21 info display //显示自动显示信息

//22.undisplay + 编号 //删除指定的自动显示

//23. ptype val //显示变量类型

//24. bt //显示函数调用栈

//库文件

//库是一组预先编译好的方法的集合。

//库有两种,一种是静态库,其命令规则为ibxxx.a,一种是共享库,其命令规则为ibxxx.so

//生成库文件的文件都必须得是.o的二进制文件

// ar crv libfoo.a add.o max.o

//gcc main.c -o main -L.-lfoo

//./main

//动态库

// gcc -shared -fPIC libfoo.so add.o max.o

// -shared: 表示生成的是动态库 -fPIC;生成无关位置代码

//动态库生成后参与编译的可执行文件 不能直接运行 有2个解决方法

// 通过ldd+可执行文件名 可以查看生成可执行文件的库链接情况

//1 将动态库文件移动到/usr/lib文件下 因为系统默认使用动态库编译出的可执行文件时,会去系统存储库发标准位置去寻找该文件

//2 LD_LIBRARY_PATH=/home/bai 设置环境变量到具体想实现可执行文件的位置(绝对路径)

// export LD_LIBRARY_PATH (export+环境变量)启用该环境变量

//如果运行某个指令时 提示权限不足 有俩个解决办法

//1 切换到管理员身份 运行该指令 任何用exit退出

//2 可以在指令前加上sudo ,也可以让该指令暂时获得管理员的权限来运行

//静态库生成的可执行文件 静态库删除时 文件还可以运行

//动态库生成的可执行文件 动态库删除时 文件不可以运行

//相同.o文件生成的静态库和动态库文件中,静态库生成的可执行文件比动态库生成的可执行文件大

//静态库在编译阶段,会将库中的文件拷贝一份到可执行文件中,可执行文件就会存在函数的声明或者其他声明和定义

//动态库在编译阶段,不会将库中的文件拷贝一份到可执行文件中,可执行文件就不会存在函数的声明或者其他声明和定义,所有他执行失败

//静态库与动态库的区别

//链接的时机与过程

//静态库 编译时链接该库

//程序编译阶段 编译器会将静态库中被引用的代码完整复制到最终的可执行文件中,一旦链接完成,文件就不在依赖静态库

//动态库 运行时链接该库

//程序编辑阶段 编译器仅记录对动态库的依赖关系,不复制库函数,运行程序时,由操作系统动态加载所需的动态库到内存中

//可执行文件必须依赖动态库

//内存和磁盘的占用

//静态库

//缺点 每个使用静态库的程序都包含一份库代码,导致可执行文件体积大,且多个程序同时运行时会重复占用内存资源

//优点 不依赖外部文件 移植性强

//动态库

//优点 库代码在磁盘只有一份 多个程序可以共享同一份内存中的库代码,操作系统通过"关系内存"节省磁盘资源

//缺点 依赖外部文件 移植性弱 移植时需要确保目标系统有对应的库

//更新与维护

//静态库 若静态库更新 所有依赖他的可执行文件无需重新编译才能所以新功能,不然只能使用旧版本代码

//动态库 如动态库更新 所有依赖他的可执行文件无需重新编译 只需要替换动态库文件 下次运行可执行文件时,会自动加载新库

//使用场景

//静态库适用于程序需要独立运行,追求稳定性 -- 小型工具 嵌入式设备程序

//动态库适用于多个程序共享代码,需要频繁更新库功能 -- 小型工具 嵌入式设备程序

相关推荐
Avan_菜菜6 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
Sokach101515 小时前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
AlfredZhao1 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3103 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
A小辣椒4 天前
TShark:Wireshark CLI 功能
linux
A小辣椒5 天前
TShark:基础知识
linux
AlfredZhao5 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci