linux中静态库和动态库的区别,Linux下静态库和动态库的区别

linux中静态库和动态库的区别,Linux下静态库和动态库的区别首先看看静态库和动态库的定义 linux 下的库有两种 静态库和共享库 动态库 二者的不同点在于代码被载入的时刻不同 静态库的代码在编译过程中已经被载入可执行程序 因此体积较大 共享库的代码是在可执行程序运行时才载入内存的 在编译过程中仅简单的引用 因此代码体积较小 不同的应用程序如果调用相同的库 那么在内存里只需要有一份该共享库的实例 下面通过一个实例来说明一下静态库和动态库的区别 构建程序 最简

首先看看静态库和动态库的定义

linux下的库有两种:静态库和共享库(动态库)。

二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

下面通过一个实例来说明一下静态库和动态库的区别。

构建程序,最简单的hellworld,其目录结构如下:

test

–hello.h

–hello.c

–test.c

各文件代码如下:

hello.h

void hello(void);

hello.c

#include “hello.h”

void hello(void)

{

printf(“Hello World\n”);

}

test.c

#include “hello.h”

int main(void)

{

hello();

return 0;

}

下面我们就分别做成静态库和动态库。

1. 静态库的制作

# gcc -o hello.o -c hello.c   //编译

# ar cqs libhello.a hello.o   //本步骤生成静态库

经过上述的步骤后,将会生成libhello.a的静态库。

下面编译test.c文件。

# gcc test.c libhello.a -o test

经过编译后,生成名为test的可执行文件,下面我们用ldd命令来看一下它的引用情况。

# ldd test

libc.so.6 => /lib64/libc.so.6 (0x00000032a0e00000)

/lib64/ld-linux-x86-64.so.2 (0x00000032a0a00000)

2. 动态库的制作

# gcc -fPIC  -o hello.o -c hello.c

# gcc -shared -Wall -fPIC -o libhello.so hello.o   //本步骤生成动态库

经过上述的步骤后,将会生成libhello.so的静态库。将libhello.so拷贝到/usr/lib/目录下。

# cp libhello.so /usr/lib/

下面编译test.c文件。

# gcc test.c -lhello -o test1

经过编译后,生成名为test1的可执行文件,下面我们用ldd命令来看一下它的引用情况。

# ldd test1

libhello.so (0x00002b67c)

libc.so.6 => /lib64/libc.so.6 (0x00000032a0e00000)

/lib64/ld-linux-x86-64.so.2 (0x00000032a0a00000)

看到区别了吧,是不是比静态链接的程序多了一个 libhello.so ?

这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里。

而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224015.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午12:53
下一篇 2026年3月17日 下午12:54


相关推荐

  • DDNS 通过阿里云API接口实现 DDNS 动态解析

    DDNS 通过阿里云API接口实现 DDNS 动态解析#!/usr/bin/envpython#coding=utf-8fromaliyunsdkcore.clientimportAcsClientfromaliyunsdkcore.requestimportCommonRequest##################################RR=’@’#你休要通过接口修改的解析主机记录值Value=’1…

    2022年5月4日
    64
  • python滑块验证码

    python滑块验证码python 自动滑块验证码

    2026年3月20日
    2
  • executorservice线程池建立_线程池 threadlocal

    executorservice线程池建立_线程池 threadlocalExecutorService建立多线程的步骤:1。定义线程类classHandlerimplementsRunnable{}2。建立ExecutorService线程池ExecutorServiceexecutorService=Executors.newCachedThreadPool();或者intc

    2025年10月23日
    3
  • c语言实现香农编码和译码_香农编码码长

    c语言实现香农编码和译码_香农编码码长1、设计思想     为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。2、设计流程     主函数部分,我们先接收要输入的信源符号个数,再接收每个信源符号的名称以及他的概率。    主函数设计好后,我们将各功能的函数分成几个模块来写,第一个是排序函数,如果你坚持从大到小输入则可以不用写;第二个…

    2025年10月22日
    3
  • matlab中的im2bw函数_matlab中tofloat

    matlab中的im2bw函数_matlab中tofloat函数功能:该函数用于填充bai图像区域和“空洞”。语法格式:BW2=imfill(BW)这种du格式将一张二值图像显示在屏zhi幕上,允许用户使用鼠标在图像上点几个点,这几个点围成的区域即要填充的区域。要以这种交互方式操作,BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠标右键单击或双击可以确定选择区…

    2025年11月5日
    5
  • 最近公共祖先详解_共同祖先

    最近公共祖先详解_共同祖先最近公共祖先带查询的节点为x和y节点,书的深度为d暴力求解:设置访问数组vis[N],以此遍历x的父节点并做标记,然后再遍历y的父节点,第一个被做标记的就是公共祖先,时间复杂度为O(d)倍增法:f[i][j]代表当前节点向上走2j2^j2j所能走到的节点,其中0≤j≤⌈log(d)⌉0\leq j \leq \lceil log(d) \rceil0≤j≤⌈log(d)⌉,时间复杂度为O(logn),另外还需要设置dist[N]代表节点i到根的距离+1,哨兵:如果从i开始跳2j2^j2j步会跳过根节

    2022年8月8日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号