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

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

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

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

//链接的时机与过程

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

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

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

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

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

//内存和磁盘的占用

//静态库

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

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

//动态库

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

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

//更新与维护

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

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

//使用场景

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

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

相关推荐
weixin_307779138 小时前
Linux下Docker Compose里运行PostgreSQL数据库故障诊断Shell脚本
linux·运维·数据库·docker·postgresql
AI创界者8 小时前
安全测试环境搭建:在 Kali Linux 中部署与配置开源 WebShell 管理工具 AntSword(蚁剑)
linux·运维·安全
猪头少年不会遇见算法学姐8 小时前
Makefile快速上手笔记
linux·学习
qiu_lovejun9989 小时前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq
运维大师9 小时前
【Linux运维极简教程】04-进程与服务管理
linux·运维
keke.shengfengpolang9 小时前
自动化考什么证书对就业有帮助?
运维·自动化
javajenius9 小时前
Masslynx 4.1安装包免费下载及详细安装教程
java·服务器·前端·其他
源码学社9 小时前
Spug 3.0 Ubuntu 22.04 Docker 部署文档
linux·ubuntu·docker·windows安装·spug
tebukaopu1489 小时前
ubuntu挂载nfs
linux·运维·ubuntu
雾沉川9 小时前
Netcatty 开源 SSH 客户端完整技术使用教程
运维·开源·ssh