尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Linux(6) 静态库与动态库初识:链接方式、依赖查看与运行原理

发布时间:2026/9/29 4:32:16

资讯中心
01
ARTICLE

Linux(6) 静态库与动态库初识:链接方式、依赖查看与运行原理

Linux(6) 静态库与动态库初识:链接方式、依赖查看与运行原理
在 Linux 下使用 GCC 编译程序时我们的代码通常不会独立完成所有工作。以最常见的printf为例它的实现并不在我们编写的源文件中而是由 C 标准库提供。这些已经编译好的通用代码被组织成“库”。理解库以及静态链接、动态链接的区别有助于我们看懂程序的依赖关系也能快速定位“缺少库”“找不到符号”等编译和运行问题。一、什么是库库是一组经过编译、可供其他程序重复使用的代码。它可以提供函数、类和其他公共功能例如C 标准库提供printf、malloc、strlen等函数C 标准库提供输入输出流、容器和算法第三方库可以提供网络通信、图像处理、数据库访问等功能。我们在源代码中包含的头文件主要保存函数声明、类型定义和宏函数的具体实现通常位于对应的库文件中。#includestdio.hintmain(void){printf(hello Linux\n);return0;}这里的stdio.h告诉编译器printf应该如何使用而printf的实现来自 C 标准库。Linux 中常见的库文件主要有两类静态库文件名通常以.a结尾动态库文件名通常以.so结尾。例如C 标准库可能以libc.a和libc.so的形式存在。不同发行版及不同体系结构的库目录可能不同常见位置包括/lib64、/usr/lib64、/lib/x86_64-linux-gnu和/usr/lib/x86_64-linux-gnu。二、什么是链接源代码经过预处理、编译和汇编后会生成目标文件但目标文件中引用的外部函数还没有完整实现。链接器需要找到这些函数对应的实现将目标文件和所需的库组织成最终的可执行程序。从库代码如何进入最终程序来看链接方式可以分为动态链接静态链接。三、动态链接在大多数 Linux 环境中GCC 默认采用动态链接。gcc code.c-ocode可以使用file查看可执行文件的基本信息filecode输出中如果出现类似下面的内容说明程序采用了动态链接ELF 64-bit LSB executable, dynamically linked1. 查看动态库依赖使用ldd可以查看程序运行时依赖哪些动态库ldd code常见输出如下linux-vdso.so.1 libc.so.6 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2其中libc.so.6是 C 标准动态库ld-linux-x86-64.so.2是动态链接器/加载器后面显示的是运行时实际找到的库文件路径。有些.so文件本身还是符号链接。例如ls-l/usr/lib64/libc.so.6可能看到libc.so.6 - libc-2.xx.so这样做可以让程序依赖稳定的库名而系统可以在升级时把该名称指向新的具体版本。2. 动态链接的工作方式动态链接不会在生成可执行文件时把所需库代码全部复制到程序内部。可执行文件主要记录自己依赖哪些动态库和符号。程序启动时动态加载器会完成以下工作读取程序的动态依赖信息在系统库路径中查找对应的.so文件将动态库映射到进程的虚拟地址空间完成符号解析和地址重定位将控制权交给程序。多个进程使用同一个动态库时操作系统可以共享其中只读的代码页从而减少重复的物理内存占用。每个进程仍然拥有独立的虚拟地址空间和需要独立保存的运行数据。3. 动态链接的特点优点可执行文件通常更小多个程序可以共享公共库代码库更新后程序在接口兼容的情况下可以直接使用新版本减少重复代码占用的磁盘空间和内存。缺点程序运行依赖外部动态库库缺失、路径错误或版本不兼容时程序可能无法启动部署时需要同时考虑程序和库的运行环境。四、静态链接静态链接会在生成可执行文件时从静态库中取出程序需要的目标代码并将其复制到最终的可执行文件中。使用 GCC 进行静态链接gcc code.c-ocode-static-static然后查看文件类型filecode-static输出中通常会出现ELF 64-bit LSB executable, statically linked再使用ldd检查ldd code-static通常会得到not a dynamic executable这表示该程序不需要通过动态加载器寻找普通的共享库依赖。1. 为什么静态程序更大动态链接只在程序中记录库依赖而静态链接会把实际需要的库代码复制进可执行文件。因此同一份源代码生成的静态程序通常明显大于动态程序。可以使用下面的命令比较文件大小ls-lhcode code-static2. 静态链接的特点优点对目标机器上的动态库依赖较少部署相对独立不容易因普通共享库缺失而无法启动。缺点可执行文件较大多个程序可能各自保存相同的库代码库修复或升级后通常需要重新链接程序部分系统功能或第三方组件并不适合完全静态链接。五、静态链接失败是怎么回事执行下面的命令时gcc code.c-ocode-static-static可能出现类似错误/usr/bin/ld: cannot find -lc collect2: error: ld returned 1 exit status-lc表示链接 C 标准库。出现该错误通常不是源代码有问题而是系统只安装了运行动态程序所需的libc.so没有安装用于静态链接的libc.a或相应的静态开发包。同理静态编译 C 程序时如果提示找不到-lstdc通常表示缺少 C 标准库的静态版本。可以先用下面的命令确认链接器能否找到对应库gcc -print-file-namelibc.so.6 gcc -print-file-namelibc.a g -print-file-namelibstdc.so g -print-file-namelibstdc.a如果命令只原样输出库名往往说明当前工具链没有找到该文件。此时应通过当前 Linux 发行版的软件包管理器安装对应的开发包或静态库包不要随意从其他系统复制库文件。六、静态库与动态库对比对比项静态库动态库常见后缀.a.so链接时机构建可执行文件时复制所需代码构建时记录依赖运行时加载可执行文件大小通常较大通常较小运行时外部依赖较少依赖对应动态库多进程共享代码较弱可共享只读代码页库升级后的处理通常需要重新链接接口兼容时可直接使用新库部署特点相对独立需要保证库及版本可用七、常用检查命令查看文件类型file可执行文件它可以帮助我们判断文件是不是 ELF 可执行文件以及采用静态链接还是动态链接。查看动态库依赖ldd 可执行文件ldd只适合查看动态程序。对于来源不可信的可执行文件不应直接运行或随意检查应先在隔离环境中分析。查看库文件及符号链接ls-l/lib64/libc.so.6ls-l/usr/lib64/libc.a实际路径会因 Linux 发行版和 CPU 架构而不同。查询 GCC 找到的库路径gcc -print-file-namelibc.so.6 gcc -print-file-namelibc.a八、一次完整的对比实验准备源文件code.c#includestdio.hintmain(void){printf(hello Linux\n);return0;}分别生成动态程序和静态程序gcc code.c-ocode gcc code.c-ocode-static-static比较文件ls-lhcode code-staticfilecodefilecode-static ldd code ldd code-static通过这组实验可以直观看到GCC 默认生成动态链接程序静态程序通常更大ldd可以列出动态程序的共享库依赖静态程序会显示not a dynamic executable。九、总结库让公共代码能够被重复使用链接则负责把我们编写的目标文件与库中的实现组合起来。动态链接生成的程序较小能够共享库代码但运行时必须找到兼容的动态库静态链接把所需代码放入可执行文件部署依赖较少但文件更大库升级后通常需要重新构建file用于判断链接类型ldd用于查看动态依赖gcc -print-file-name可以帮助定位库文件。理解这些内容后再学习 Makefile 时就能更清楚地知道构建工具究竟在组织哪些源文件、目标文件和链接命令。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。