【Linux】 编译与动静态库相关 目录前言Part1. GCC四个编译阶段Part1.1. 预处理Part1.2. 编译Part1.3. 汇编Part2. 静态库与动态库Part2.1. 动态库Part2.2. 静态库Part2.3. gcc静态链接参数Part3. 条件编译Part4. /etc/sudoers 权限配置Part5. 目标文件 .oPart6. Make与MakefilePart7. 结语前言在Linux中对于编译以及动静态库的理解是非常重要的因此来跟随小编的视角来看看吧。lets go!!!!!!!!Part1. GCC四个编译阶段Part1.1. 预处理gcc -E x.c -o y.i对x.c执行预处理输出预处理结果保存到y.i。完成头文件展开、宏替换、条件编译处理、删除注释。Part1.2. 编译gcc -S x.c -o y.s将C代码翻译成汇编代码汇编结果保存到y.s。Part1.3. 汇编gcc -c x.c -o y.o汇编完成生成.o目标文件内容为二进制机器指令但还不能直接运行缺少链接步骤。完整流程先生成.o目标文件再通过链接生成可执行程序exe。完整命令gcc x.o -o exe。使用ldd 可执行程序可以查看程序依赖哪些共享库。Part2. 静态库与动态库后缀区分库类型 Linux Windows动态库.so .dll静态库.a .libPart2.1. 动态库程序运行时才去库文件中寻找对应函数执行。执行printf这类库函数时根据地址跳转至库中对应函数执行。• 动态链接编译链接阶段仅做标记记录库函数符号程序运行时才跳转到库函数真实地址。• 优点内存占用小多个程序可以共享内存中同一份库内存中只加载一份。• 缺点依赖系统库文件如果库丢失程序直接无法运行。Part2.2. 静态库编译链接阶段把库里面的代码拷贝、合并进我们自己的可执行程序内部。• 优点不依赖外部库文件移植方便程序可以独立运行。• 缺点可执行文件体积会显著变大多个程序会各自拷贝一份库代码内存冗余。Part2.3. gcc静态链接参数gcc x.c -o y -static加上‑static使用静态库链接生成的可执行文件体积会明显增大。使用file 可执行文件名可以查看该程序是动态链接还是静态链接。P.S. ldd命令无法查看静态链接程序的依赖静态程序已经把库打包进自身。Part3. 条件编译条件编译发生在预处理阶段本质就是修改源代码文本。根据宏定义选择性保留/裁剪一部分代码。#ifdef X // 如果 X 被 #define 定义过这部分代码才参与编译 #endif //gcc命令行定义宏 # 定义宏E gcc x.c -o y -DE # 定义宏Z赋值100 gcc x.c -o y -DZ100实际使用场景1 版本控制外部通过宏控制实现VIP版本、普通用户版本。预处理阶段直接裁掉对应代码不会编译进最终程序。2 跨平台开发一套代码同时在Linux、Windows运行。通过条件编译识别当前操作系统调用对应平台API。3 调试开关通过宏打开/关闭调试打印。p.s. 条件编译是预处理完成代码裁剪发生在编译之前。Part4. /etc/sudoers 权限配置修改/etc/sudoers可以配置普通用户sudo权限实现普通用户拥有管理员能力。Part5. 目标文件 .o1 将.c源文件编译生成.o目标文件可以保护源码不直接暴露2.o存放机器指令多个.o可以打包成库文件。Part6. Make与Makefile•make工具程序•Makefile配置脚本文件描述编译依赖关系与编译命令。Makefile基础格式//目标: 依赖文件 //编译命令 //示例 code: code.c gcc -o code code.c逻辑如果code.c存在执行gcc指令生成code可执行程序。Part7. 结语这篇文章我们认识到了Linux编译与动静态库的相关知识接下来小编还会带来更多Linux相关的知识敬请期待~最后祝大家可以春风得意马蹄疾一日看尽长安花最后的最后要是觉得本文还可以的话可以点点赞关注小编一波谢谢大家~