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文件生成的静态库和动态库文件中,静态库生成的可执行文件比动态库生成的可执行文件大
//静态库在编译阶段,会将库中的文件拷贝一份到可执行文件中,可执行文件就会存在函数的声明或者其他声明和定义
//动态库在编译阶段,不会将库中的文件拷贝一份到可执行文件中,可执行文件就不会存在函数的声明或者其他声明和定义,所有他执行失败
//静态库与动态库的区别
//链接的时机与过程
//静态库 编译时链接该库
//程序编译阶段 编译器会将静态库中被引用的代码完整复制到最终的可执行文件中,一旦链接完成,文件就不在依赖静态库
//动态库 运行时链接该库
//程序编辑阶段 编译器仅记录对动态库的依赖关系,不复制库函数,运行程序时,由操作系统动态加载所需的动态库到内存中
//可执行文件必须依赖动态库
//内存和磁盘的占用
//静态库
//缺点 每个使用静态库的程序都包含一份库代码,导致可执行文件体积大,且多个程序同时运行时会重复占用内存资源
//优点 不依赖外部文件 移植性强
//动态库
//优点 库代码在磁盘只有一份 多个程序可以共享同一份内存中的库代码,操作系统通过“关系内存”节省磁盘资源
//缺点 依赖外部文件 移植性弱 移植时需要确保目标系统有对应的库
//更新与维护
//静态库 若静态库更新 所有依赖他的可执行文件无需重新编译才能所以新功能,不然只能使用旧版本代码
//动态库 如动态库更新 所有依赖他的可执行文件无需重新编译 只需要替换动态库文件 下次运行可执行文件时,会自动加载新库
//使用场景
//静态库适用于程序需要独立运行,追求稳定性 -- 小型工具 嵌入式设备程序
//动态库适用于多个程序共享代码,需要频繁更新库功能 -- 小型工具 嵌入式设备程序
