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文件生成的静态库和动态库文件中,静态库生成的可执行文件比动态库生成的可执行文件大

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

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

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

//链接的时机与过程

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

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

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

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

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

//内存和磁盘的占用

//静态库

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

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

//动态库

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

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

//更新与维护

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

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

//使用场景

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

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

相关推荐
星蓝_starblue2 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
fb_123453 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
深念Y3 小时前
随身WiFi设备记录
linux·嵌入式·无线·射频·随身wifi·zte
柒号华仔4 小时前
【LINUX】Linux从闹钟到高精度定时器的实现
linux
Crazy________4 小时前
k8s部署若依微服务架构流程,v3.6.6
运维·云原生·容器·kubernetes·状态模式
云飞云共享云桌面5 小时前
广东精密机械设备工厂8-10人共享一台SolidWorks设计服务器
运维·服务器·3d·自动化·汽车·制造
jieyucx5 小时前
【高级利用】条件竞争与逻辑漏洞:与服务器赛跑的艺术
android·运维·服务器·web安全·文件上传
tianyuanwo5 小时前
服务器OS组件研发效能度量可视系统——顶层方案设计与阶段性规划
运维·服务器·度量系统
初级炼丹师(爱说实话版)5 小时前
Ubuntu服务器配置docker
服务器·ubuntu·docker
机建狂魔6 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex