【Linux操作系统】程序的编译和动静态链接
2023-06-13 09:16:43 时间
文章目录
一.编译
写在前面
编译这整个过程都只是在编译你自己写的代码,直到链接才让你的代码和库的代码关联起来,最终形成可执行程序
源程序到可执行程序的整个过程: ESc-iso
1.预处理
预处理四大任务:
头文件展开
,去注释
,宏替换
,条件编译
gcc test.c -E -o test.i
-E:开始翻译,并且在预处理后停下来
-o:指明形成临时文件的名称
通过这里我们可以看到预处理后还是C语言代码,预处理完成的只是文本操作!
ps:这里不带-o是不行的,程序停下来后会将预处理后的文件内容直接打印到终端
通过-o生成的.i文件我们可以清晰的看到头文件展开后的结果是一堆函数和变量的声明,并没有函数的具体实现!
.h(头文件)中只包含函数的声明,函数的具体实现在标准库里
头文件存在的最大意义: 1.提供函数的声明 2.自动补全代码
2.编译
编译是将C语言代码翻译成汇编代码
gcc -S test.c -o test.s
3.汇编
汇编是将汇编代码翻译成二进制代码
gcc -c test.c -o test.o
汇编完成后得到二进制代码,但是这并不能被执行,因为编译这整个过程都只是在编译你自己写的代码,直到链接才让你的代码和库的代码关联起来,最终形成可执行程序.
二.(动静态)链接
链接的目的:把自己写的并且编译好的二进制代码和库里的二进制代码关联起来,形成可执行程序!
1.动态链接
动态链接方式:在运行时需要去标准库里找函数的实现 优点:形成的可执行程序体积小 缺点:依赖动态库,易收到动态库丢失等原因出现运行时错误!
gcc test.c -o test//Linux-默认是动态链接的链接方式
file 可执行程序
ldd 可执行程序
//在linux中, ldd是list dynamic dependencies的缩写, 意思: 列出动态库依赖关系
dynamically linked (uses shared libs)//动态链接方式(共享库)
libc.so.6 => /lib64/libc.so.6 (0x00007f86cd306000)//动态库->位置(代码地址)
2.静态链接
静态链接方式:在链接时直接将函数的实现拷贝一份到我的程序中,运行时不用找! 优点:不依赖第三方库 缺点:形成的可执行程序体积大
gcc test.c -o test -static//指明采用静态链接的链接方式
file test
statically linked//静态链接方式
3.静态链接库的下载安装
动态库一般系统自带,因为系统运行时需要用到动态库 静态库在Linux中一般要自行安装
sudo yum install glibc-static//安装C静态库
sudo yum install libstdc++-static//安装c++静态库
gcc test.c -o test -static//生成静态程序test
4.windows下动静态库的后缀
windows下动静态库的后缀:
动态库:.dll
静态库:.lib
相关文章
- linux抓本来端口包,Linux抓包
- 研究Linux系统中的链接文件(linux的链接文件)
- Linux取消链接:指令操作步骤(linux取消链接)
- 轻松上手:完美体验新一代轻量级Linux系统(轻量级linux)
- Linux调用C静态库的简易方法(linux调用c静态库)
- Linux环境下伪静态配置实践(linux配置伪静态)
- Linux拷贝链接:快速掌握技巧(linux拷贝链接)
- 服务器远程掌控:用手机控制Linux服务器(手机控制远程linux)
- 连接使用Linux系统实现远程断开连接(linux远程断开)
- Linux下查看硬链接的方法(linux查看硬链接)
- 链接Linux动态库隐式链接技术研究(linux动态库隐式)
- 个性化桌面突破极限,Linux定制个性化桌面(linux制作)
- Linux下配置静态IP:步骤指南(linux静态ip配置)
- Linux符号链接复制:轻松实现(linux符号链接复制)
- Qt 静态编译在 Linux 的实践(qt静态编译linux)
- 指引你完成服务器u盘安装Linux(服务器u盘安装linux)
- Linux服务器性能优化:提高速度效率(linux服务器速度优化)
- 如何在Linux系统中更改登录用户?(linux更改登录用户)
- 轻松搞定!教你如何删除Linux的符号链接(linux符号链接删除)
- Linux链接工具概览(linux链接工具)
- 监控Linux系统运行状态的监控与分析(linux运行状态)
- 如何重装Linux实现双系统:技巧与步骤(双系统重装linux)
- 探秘阿里云Linux主机名:如何修改和优化?(阿里云linux主机名)
- 如何查看 Linux 系统中有多少个文件?(linux查看多少文件)
- Linux走向终极:链接无限目录之旅(linux 链接 目录)
- Linux下创建文件夹的简便方法:建立文件夹链接(linux建立文件夹链接)
- 如何防范Linux系统的溢出攻击(linux溢出)
- Linux文件链接技术指南(linux 文件 链接)
- Linux ln命令:覆盖轻松实现文件快速软链接(linux ln 覆盖)
- Linux下如何快速创建用户?(linux 创建用户命令)
- Linux让睡眠更加甜蜜(linux睡眠)