IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux学习笔记之编译相关篇(2)_静态链接与动态链接 -> 正文阅读

[系统运维]Linux学习笔记之编译相关篇(2)_静态链接与动态链接

Linux学习笔记系列文章目录

前置知识篇
1. 进程
2. 线程
进程间通信篇
1. IPC概述
2. 信号
3. 消息传递
4. 同步
5. 共享内存区
编译相关篇
1. GCC编译
2. 静态链接与动态链接


一、前言

上节说到使一个.c文件变成一个可执行文件需要经历以下几个步骤:预处理(-E得到文本文件.i)、编译(-S得到文本文件.s)、汇编(-c得到二进制文件.o)、链接(gcc最终得到可执行文件)。这节来讲一下链接这个过程主要涉及到的两个知识点:静态链接与动态链接。


二、前置条件

UB18 + 一点点的基础知识


三、本文参考资料

《静态链接与动态链接补充(Linux)》
百度


四、正文部分

4.1 概述

链接就是把目标文件与一些库文件生成可执行文件的一个过程。
而链接这个过程又可以分为两种情况,一个是静态链接,一个是动态链接

4.1.1 静态链接

  • 定义
    静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。

    链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。

    这里的库指的是静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。

  • 优点:
    代码装载速度快,执行速度略比动态链接库快;
    只需保证在开发者的计算机中有正确的.lib文件,在以二进制形式发布程序时不需考虑在用户的计算机上.lib文件是否存在及版本问题。

  • 缺点:
    使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费。

4.1.2 动态编译

  • 定义
    动态链接(Dynamic Linking),把链接这个过程推迟到了运行时再进行,在可执行文件装载时或运行时,由操作系统的装载程序加载库。

    这里的库指的是动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

    值得一提的是,在Windows下的动态链接也可以用到.lib为后缀的文件,但这里的.lib文件叫做导入库,是由.dll文件生成的。

  • 优点:
    生成的可执行文件较静态链接生成的可执行文件小;
    适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试;
    不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
    DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

  • 缺点:
    使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息;
    速度比静态链接慢;
    ?

4.2 实验

4.2.1 前置准备

4.2.1.1 创建相对应文件

  1. main.c
    /* main.c */
    #include "test.h"
    
    int main(void)
    {
    	print_hello();
    	return0;
    }
    
  2. test.c
    #include "test.h"
    
    void print_hello(void)
    {
    	printf("hello world\n");
    }
    
  3. test.h
    #ifndef __TEST_H
    #define __TEST_H
    
    #include <stdio.h>
    
    void print_hello(void);
    
    #endif
    

4.2.1.2 生成目标文件

gcc -c main.c test.c

在这里插入图片描述

4.2.2 动态链接

  1. 生成动态库.so的命令为:

    gcc -shared test.o -o libtest_d.so
    

    在这里插入图片描述

  2. 使用链接动态库的方法生成可执行程序

    gcc main.o -L. -ltest_d -o test_d.out
    

    其中-L.表示在搜索库文件时包含当前目录
    在这里插入图片描述
    不能找到共享库文件libtest_d.so,加载失败。因为一般情况下Linux会在/usr/lib路径中搜索需要用到的库,而libtest_d.so库并不在这个路径下。
    解决方法有两种:
    一种就是把这个文件拷贝至/usr/lib路径下,但是一般不允许这样做,一般用户也不允许往这个路径里拷贝东西。
    另一种就是把当前路径增加为动态库的搜索路径,命令为:
    export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

4.2.3 静态链接

静态库用ar工具来制作。ar是一个归档工具,用于建立、修改、提取归档文件(archive)。
一个归档文件可以包含多个目标文件,也被称为静态库。在Linux下,静态库的扩展名一般为.a。

  1. 把目标文件test.o做成静态库:

    	ar -rv libtest_s.a test.o
    

    在这里插入图片描述

  2. 使用链接静态库的方法生成可执行程序

    	gcc main.o -L. -ltest_s -o test_s.out
    

    在这里插入图片描述
    删除静态库之后,可执行程序也是能正常运行的。事实上,使用链接静态库的方式生成的可执行程序与直接使用目标文件生成的可执行程序没有区别。
    只是经过了静态库的链接,变为了一个文件,方便于调用、移植和保存。

    归档工具ar可以很方便地查看和删除归档文件中的成员。
    查看静态库libtest_s.a中的内容,命令:

    	ar -t libtest_s.a
    

    删除库中的test.o

    	ar -d libtest_s.a test.o
    

    在这里插入图片描述

?


五、总结

把静态链接与动态链接做一个这样子的比喻:把链接过程看做我们平时学习时做笔记的过程。

我们平时学习时准备一本笔记本专门记录我们的学习笔记,比如在某本书的某一页上看到一个很好很有用的知识,这时候我们有两种方法记录在我们的笔记本上。

一种是直接把那一页的内容全部抄写一遍到笔记本上(静态链接);另一种是我们在笔记本上做个简单的记录(动态链接),比如写上:xxx知识点在《xxx》的xxx页。

从这两种方法中我们可以很清楚地知道两种方式的特点。第一种方式的优点就是我们在复习的时候就很方便,不用翻阅其它书籍了,但是缺点也很明显,就是占用笔记本的空间很多,这种方法很快就把我们的笔记本给写满了。

第二种方式的优点就是很省空间,缺点就是每当我们复习的时候,手头上必须备着相关的参考书籍,比如我们去教室复习的时候,就得背着一大摞书去复习,这样我们复习的效率可能就没有那么高了。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 17:06:53  更:2022-06-26 17:08:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:42:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码