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

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

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

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

//链接的时机与过程

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

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

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

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

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

//内存和磁盘的占用

//静态库

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

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

//动态库

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

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

//更新与维护

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

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

//使用场景

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

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

相关推荐
xingfujie1 小时前
Ubuntu K8s 1.28 kubeadm 高可用集群部署实战
linux·运维·服务器·docker·kubernetes
Tutankaaa1 小时前
从单场到多场并发:知识竞赛平台的弹性扩展能力
服务器·笔记·学习·职场和发展
实心儿儿1 小时前
Linux —— 进程间通信 - 命名管道
linux·运维·服务器
funnycoffee1231 小时前
Cisco Firewpower 4100 9300 FXOS change management ip address
linux·数据库·tcp/ip
Agent手记1 小时前
多渠道订单数据处理自动化,落地步骤与ERP打通方案 | 2026企业级智能体实战手册
运维·人工智能·ai·自动化
呉師傅1 小时前
统信UOS如何安装本地打印机驱动以及URL查找网络打印机并安装驱动方法
运维·服务器·网络·windows·电脑
iFlow_AI1 小时前
构建自动化专属Paper库:用 Happy-Notes + iFlow-search-skill 搭建阅读写作流水线
运维·自动化·skill·心流·happy-notes
青梅橘子皮1 小时前
Linux---开发工具(1)(vim,gcc/g++)
linux·运维·服务器
邮专薛之谦1 小时前
Linux常用指令大全(完整版)
linux·运维·服务器