【Linux操作系统】程序的编译和动静态链接

简介: 【Linux操作系统】程序的编译和动静态链接

一.编译

写在前面

编译这整个过程都只是在编译你自己写的代码,直到链接才让你的代码和库的代码关联起来,最终形成可执行程序

源程序到可执行程序的整个过程: ESc-iso

c1f8be5dabfc4e7091636f8df2a01f0e.jpg

1.预处理

预处理四大任务:头文件展开去注释宏替换条件编译

gcc test.c -E -o test.i


-E:开始翻译,并且在预处理后停下来


-o:指明形成临时文件的名称


893b08a53e431ed960b84e1439976807.png


通过这里我们可以看到预处理后还是C语言代码,预处理完成的只是文本操作!


ps:这里不带-o是不行的,程序停下来后会将预处理后的文件内容直接打印到终端


7ccae8d0dac631cca3c83356c5d45a60.png


通过-o生成的.i文件我们可以清晰的看到头文件展开后的结果是一堆函数和变量的声明,并没有函数的具体实现!


.h(头文件)中只包含函数的声明,函数的具体实现在标准库里


头文件存在的最大意义:


1.提供函数的声明


2.自动补全代码

a0c150ea27f757d3f958d38f4c194e4c.png


2.编译

编译是将C语言代码翻译成汇编代码

gcc -S test.c -o test.s

3.汇编

汇编是将汇编代码翻译成二进制代码

gcc -c test.c -o test.o


汇编完成后得到二进制代码,但是这并不能被执行,因为编译这整个过程都只是在编译你自己写的代码,直到链接才让你的代码和库的代码关联起来,最终形成可执行程序.

a877815e5c4b30933be7c60836a8c5ac.png

二.(动静态)链接

链接的目的:把自己写的并且编译好的二进制代码和库里的二进制代码关联起来,形成可执行程序!

2085e8ddd3b58a147a496eddc93c2694.png

1.动态链接

动态链接方式:在运行时需要去标准库里找函数的实现

优点:形成的可执行程序体积小

缺点:依赖动态库,易收到动态库丢失等原因出现运行时错误!

gcc test.c -o test//Linux-默认是动态链接的链接方式
file 可执行程序
ldd 可执行程序
//在linux中, ldd是list dynamic dependencies的缩写, 意思: 列出动态库依赖关系

120a824873d4ae1fe7c0b4938f3d5239.png

dynamically linked (uses shared libs)//动态链接方式(共享库)
libc.so.6 => /lib64/libc.so.6 (0x00007f86cd306000)//动态库->位置(代码地址)

2.静态链接

静态链接方式:在链接时直接将函数的实现拷贝一份到我的程序中,运行时不用找!

优点:不依赖第三方库

缺点:形成的可执行程序体积大

gcc test.c -o test -static//指明采用静态链接的链接方式
file test

26e0675e69914488d7236728eb177924.png

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


目录
相关文章
|
9月前
|
安全 Linux iOS开发
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
631 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
955 2
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
1631 0
Vanilla OS:下一代安全 Linux 发行版
|
11月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
11月前
|
Web App开发 缓存 Rust
|
11月前
|
Ubuntu 开发工具
Ubuntu 22.04 aarch64版本操作系统下编译ZLMediaKit教程
通过上述步骤,你可以在Ubuntu 22.04 aarch64版本上成功编译ZLMediaKit,这是一个相对简单而直接的过程,但可能会遇到一些需要根据具体系统环境和要求调整的地方。
1241 0
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
590 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
724 10
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
376 7

热门文章

最新文章