首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux静态库依赖动态库

基础概念

静态库(Static Library)是在编译时直接链接到可执行文件中的库文件。它通常以 .a 文件形式存在,包含了预编译的目标代码。

动态库(Dynamic Library)是在程序运行时加载到内存中的库文件。它通常以 .so 文件形式存在,在Linux系统中,动态库允许多个程序共享同一份库代码,从而节省内存空间并便于更新和维护。

依赖关系

当一个静态库依赖于动态库时,意味着静态库中的一些函数或数据需要通过动态库来实现或访问。这种情况下,虽然静态库本身是独立的,但在使用静态库编译最终的可执行文件时,需要确保动态库可用。

优势

  1. 资源共享:动态库允许多个程序共享同一份代码,节省内存。
  2. 易于维护和升级:更新动态库后,所有依赖它的程序无需重新编译即可使用新版本。
  3. 灵活性:可以在不修改程序源代码的情况下替换或升级动态库。

类型与应用场景

  • 标准库:如 libc,几乎所有的C程序都会用到。
  • 第三方库:如 libcurl(用于HTTP请求)、libjpeg(用于JPEG图像处理)等,广泛应用于各种专业领域。
  • 自定义库:开发者根据项目需求自行创建的库。

遇到的问题及原因

问题:在链接静态库时,可能会遇到找不到动态库的错误。

原因

  • 动态库未安装或路径不正确。
  • 编译时未指定正确的库搜索路径。
  • 运行时环境变量(如 LD_LIBRARY_PATH)未设置正确。

解决方法

  1. 安装缺失的动态库: 使用包管理器安装所需的库,例如在Debian/Ubuntu系统上:
  2. 安装缺失的动态库: 使用包管理器安装所需的库,例如在Debian/Ubuntu系统上:
  3. 指定库搜索路径: 在编译时使用 -L 选项指定动态库的路径,例如:
  4. 指定库搜索路径: 在编译时使用 -L 选项指定动态库的路径,例如:
  5. 设置运行时环境变量: 在运行程序前设置 LD_LIBRARY_PATH 环境变量,包含动态库的路径:
  6. 设置运行时环境变量: 在运行程序前设置 LD_LIBRARY_PATH 环境变量,包含动态库的路径:
  7. 更新 /etc/ld.so.conf: 如果动态库安装在非标准路径,可以将该路径添加到 /etc/ld.so.conf 文件中,并运行 ldconfig 命令刷新缓存。

示例代码

假设有一个静态库 libstatic.a 依赖于动态库 libdynamic.so,以下是编译和运行程序的步骤:

代码语言:txt
复制
# 编译静态库依赖的源文件
gcc -c -fPIC libdynamic.c -o libdynamic.o
gcc -shared -Wl,-soname,libdynamic.so -o libdynamic.so libdynamic.o

# 编译主程序
gcc -c myprogram.c -o myprogram.o
gcc -o myprogram myprogram.o -L. -lstatic -ldynamic

# 运行程序前设置环境变量
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./myprogram

通过上述步骤,可以确保静态库正确链接到所需的动态库,并在运行时成功加载。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】静态库和动态库

接下来我们使用 ldd 查看该可执行程序依赖的库文件: 如上图,为什么我们的程序没有依赖到 mylib 的库呢?那是因为我们的可执行程序默认是动态链接的,ldd 是只能查动态库的!...而静态库是直接拷贝到可执行程序中的,所以它们会被一起加载到内存中。也就是说,动态链接非常依赖这个动态库!...另外,如果别人给我们的库中既包含动态库也包含静态库,即同一个库中提供动静态两种库,gcc 默认使用动态库!...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的库以及地址,符号表就是动态链接这些动态库的。...理解动态库加载 接下来我们回到地址空间中理解动态库的加载,首先磁盘中有我们的 ELF 可执行程序,可执行程序中的符号表中依赖了 libmylib.so 这样的动态库,如下图: 但是当我们将可执行程序加载到内存中后

74610

linux动态库和静态库

;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-fPIC,-shared;静态库链接时搜索过程;动态库链接时...,加载时搜索的过程;动态库找不到的问题;库的依赖问题;动态库升级问题与步骤 一、基本概念 1.1、什么是库 在 windows 平台和 linux 平台下都大量存在着库。       ...1.2、 库的种类  linux 下的库有两种:静态库和共享库(动态库)。...可以看到 ln 命令依赖于 libc 库和 ld-linux 库 1.7、使用nm工具,查看静态库和动态库中有那些函数名; (T类表示函数是当前库中定义的,U类表示函数是被调用的,...在Linux下,动态库和静态库同事存在时,gcc/g++的链接程序,默认链接的动态库。

12.4K20
  • linux 动态库 静态库_静态库里面包含动态库

    动态库与静态库 文件系统补完 文件的三个时间acm 动态库与静态库 动态链接与静态链接 静态库与动态库 动静态库的对比 生成静态库 打包静态库 使用静态库 生成动态库 打包动态库 使用动态库 文件系统补完...动态库是动态链接生成的,而静态库是静态链接生成的。...生成动态库 学习完生成和使用静态库后,下面我们来生成一下动态库。...打包动态库 在这里,我们将生成动态库的依赖关系及方法写进自动化构建工具中: 需要注意的是: 由于库在内存中是可加载的,它可能在内存中的任意位置,也可能被映射到进程地址空间的每个区域,所以为了保证库当中的代码执行不会出错...这里由于在依赖关系中已经点明了要生成的目标文件,故不带上$@也可以 打包动态库不需要像静态库一样使用ar指令,直接用gcc即可,但是需要带上-shared选项表示生成共享库格式,这也体现了动态库代码映射在共享区的特点

    7.4K20

    【Linux】静态库和动态库

    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...程序运行的时候将不再需要静态库 动态库(.so):库文件以.so为后缀,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...究竟是动静态库,取决你提供的是动态库还是静态库。...: 静态库采用的是绝对编址 动态库采用的是相对编址,动态库中的指定函数的地址通过相对编址(库中的偏移地址+段起始地址): 动态库打包:-shared gcc -shared -o libmymath.so

    32230

    Linux共享库、静态库、动态库详解

    程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):...1、静态函数库,是在程序执行前就加入到目标程序中去了 ; 2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)...理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数库)的程序运行速度上快一些,大概1-5%。...如果有好几个函数库,它们之间有一些依赖关系的话,例如X依赖Y,那么你就要先加载那些被依赖的函数。例如先加载Y,然后加载X。...在几乎所有情况下,您至少有两个依赖关系: /lib/ld-linux.so.N(其中N为1或更多,通常至少为2)。这是加载所有其他库的库。 libc.so.N(N为6以上)。这是C库。

    8.9K11

    Linux静态库与动态库加载

    在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。 在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。 认识了动态库,那静态库,又是什么呢?...,不再需要库,但动态库不行,在日常我们都会使用动态库,很少使用静态库。...注意上面我打包了两个库,虽然看后缀一个静态库,一个动态库,但是其实上述的库都是静态库,linux不是单单通过后缀来判断一个库的类型,下面就来看看如何真正打包一个动态库吧。...打包:使用-shared选项将所有目标文件打包为动态库 与生成静态库不同的是,生成动态库时我们不必使用ar命令,我们只需使用gcc的-shared选项即可。...,操作系统找不到该可执行程序所依赖的动态库,我们可以使用ldd命令进行查看。

    18510

    Linux之动态库和静态库

    前言 一、动态库和静态库概念 在之前的文章中,介绍过动静态库的概念,因此这次我们只是简单回顾一下。 Linux中的库分为动态库和静态库。...总结 -I 指明头文件的路径 -L 指明库文件的搜索路径 -l 指明要链接哪个库,要带上库的名称(去掉前缀和后缀) 注意 gcc默认是动态链接,对于一个特定的库,究竟是动态链接还是静态链接取决于提供的是动态库还是静态库...静态库采用的是绝对编址; 动态库采用的是相对编址。即,指定函数的地址采用相对编址(库中的偏移地址 + 段起始地址)。...动态库相对于静态库更节省内存,静态库由多个程序使用相同的库函数,加载到内存中就会导致内存中有多份重复的库函数代码,而动态库则是多个程序共用一份动态库,不会导致出现重复的库函数代码,就节省了内存空间。...总结 以上就是今天要讲的内容,本文介绍了Linux中的动静态库的相关概念。

    59420

    Linux下的静态库与动态库

    由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 2.库的种类 linux下的库有两种:静态库和共享库(动态库)。...4.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库...动态库的后缀是.so,它由gcc加特定参数编译产生。...在linux下,库文件一般放在/usr/lib /lib下, 静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称 动态库的名字一般为libxxxx.so.major.minor,xxxx...库和ld-linux库 7.可执行程序在执行的时候如何定位共享库文件 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径 此时就需要系统动态载入器(dynamic linker

    9610

    【Linux】动态库与静态库的底层比较

    1 前言 我们前两篇文章讲解了如何建立动静态库与如何使用动静态库。 接下来我们就来深入聊聊动静态库。...2 编译使用比较 那么 gcc编译的时候是怎么进行的: gcc不加-static选项默认使用动态库,没有提供动态库就只能使用静态库 gcc加-static选项就使用静态库 那么-static的意义是什么呢...将我们的程序进行静态链接,这就要求我们链接的任何库都要通过对应的静态库版本!!! 一般我们的操作系统都是动态库 并且在对.o文件打包的时候: 静态库使用ar -rc 文件名......动态库使用gcc -shared,前提是.o文件里进行-fPIC位置无关码的设置gcc -fPIC -c 文件名 使用的方法: 静态库: 安装到操作系统中,.h 文件放入/user/include...静态库很简单,不需要考虑这么多,因为在编译期间就把静态库的内容拷贝到了可执行文件当中。就不必谈论找到静态库这一说了。动态库就不一样,需要在运行的过程中寻找与加载!

    23310

    动态库与静态库

    本文目标: ⭐认识动态静态库,学会结合gcc选项,制作动静态库⭐ ⭐了解动态库加载过程⭐ 库的一些概念: 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。...程序运行的时候将不再需要静态库。 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...形成一个可执行程序,可能不仅仅只依赖一个库!而gcc的库默认是动态链接,但是当提供的是静态库时,并不能说gcc不会使用静态库,事实证明,不管是动态还是静态,都可以使用。...因此,gcc默认动态库,是建议的意思,对于一个指定的库,是动态还是静态,取决于我们使用的库的什么库。如果在使用的若跟个库里面,只要有一个是动态库,那么,这个可执行程序就是动态链接的!...动态库 站在制作者的角度:生成动态库 动态库也是库,跟静态库差不多,也是.o文件归档,带上相应的头文件。其中的区别就是多加了一个选项:-fPIC。

    2.3K30

    Linux基础——gcc编译、静态库与动态库(共享库)

    测试代码的目录结构如上图所示,include中存放的是头文件,lib中存放的是静态(动态)库,src中存放的是源代码,main.c是发布代码。.../include 第二步:创建静态库 ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库中,c创建静态库,不管库是否存在,s写入一个目标文件索引到库中...(共享库) 1、动态库的命名格式 lib + 库的名字 + .so 例:libMyTest.so (MyTest为动态库的名字) 2、动态库作用分析 共享库的代码是在可执行程序运行时才载入内存的...优点: 节省内存 易于更新,不用重新编译可执行程序,运行时自动加载 缺点: 延时绑定,速度略慢 3、动态库的制作与使用 测试代码的目录结构与静态库相同。.../app (执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径) 第二种方法: gcc + 源文件 + -I头文件 + libxxx.so

    8.7K40

    iOS 静态库&动态库

    iOS下的存在形式 静态库:.a和.framework 动态库:.dylib和.framework(系统提供给我们的framework都是动态库!)...WWDC2014(iOS8)以后,苹果允许开发者自行开发动态库。...app动态更新 开放了动态库的使用权限之后,开发者可以自定义创建framework实现软件的动态更新(即绕过apple store审核,从服务器发布更新版本),不过含有自定义的framework的app...---- 2019年11月14日更新 framework跟.a的区别 .a是多个目标文件.o的集合,它在生成的时候只需要所依赖静态库的头文件,不需要具体的实现,所以最终用的时候需要链接依赖的静态库,这可能会出现...openssl由于版本不一致导致的冲突问题 framework是二进制代码,它所依赖的静态库会在生成framework的时候被链接进去,所以最终用的时候只需要framework,不再需要.a了,这可以用于解决

    2.5K20

    动态库和静态库

    在 Linux 编程中,库是组织和共享代码的一个重要机制,主要分为静态库(Static Library)和动态库(Dynamic Library)。下面详细介绍它们的类型、使用方式、优缺点以及总结。...更新库时需要重新编译所有依赖该库的可执行文件。 动态库(Dynamic Library) 1. 什么是动态库 动态库是在运行时被加载的库,通常后缀为 .so(例如 libmylib.so)。...总结 主要区别 特性 静态库 动态库 文件后缀 .a .so 链接方式 编译时链接 运行时链接 文件大小 相对较大 相对较小 可移植性 依赖库版本 通过接口兼容性提高可移植性 更新 需要重新编译 可以更新库而无需重新编译...选择建议 使用静态库: 程序需要高性能,且不希望运行时有外部依赖。...目标系统较为简单,库更新频率不高。 使用动态库: 需要共享库的多个程序。 需要频繁更新库,而不想重新编译所有依赖的程序。

    15910

    静态库 VS 动态库

    如何得到库 ①先写好一堆的.c文件(.c:我们所需要的各种工具函数) ②将这些.c编译为对应的.o ③将所有的这些.o打包为一个仓库文件(静态库或者动态库) 静态库:按照静态库的方式打包 动态库:按照动态库的方式打包...静态库:静态链接,由静态链接器(collect2/ld)来实现 动态库:动态链接,由动态链接器来实现 静态库 链接静态库 与 链接一般的.o没有区别 比如,如果printf函数是由静态库来提供的话,那就需要连接...实际上只包含printf部分 动态库 主要是为了解决静态库的缺点而存在的。...链接动态库 在链接动态库时,collect2/ld不会将动态库中.o的代码直接静态链接(复制)到自己程序中,只会留下调用接口。...静态库 与 动态库的名字尾缀 静态库名字尾缀 ①windows:尾缀为.lib ②Linux:尾缀为.a 动态库名字尾缀 ① windows:尾缀为.dll ②Linux:尾缀为.so

    30110

    C++动态库和静态库_动态库和静态库调用方法

    2、定义 静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。 静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。...优点 缺点 静态库 1、 使可执行文件依赖项少,已经被打包到可执行文件中了2、 编译阶段完成链接,执行期间代码装载速度快 1、 使可执行文件变大2、 若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包...4、文件形式 Tables Windows Linux 静态库 .lib Libxxx.a 动态库 .dll与.lib libxxx.so 5、生成和加载方式 这里我仅讨论windows下的使用vs...步骤2:“属性面板”—》”配置属性”—》“链接器”—》”常规”,附加依赖库目录中输入,静态库所在目录; 步骤3:“属性面板”—》”配置属性”—》“链接器”—》”输入”,附加依赖库中输入静态库名...6、总结 库分为静态库和动态库。静态库与可执行文件打包,动态库与可执行文件独立。静态库加载需要.lib和.h文件。动态库隐式加载需要.dll、.h、.lib文件,显示加载只需要.dll文件。

    3.2K20

    Linux下动态库(.so)和静态库(.a) 的区别

    linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。...静态库和动态库的最大区别,静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。...所依赖的动态库查找路径环境变量名称各不相同 UNIX版本              动态库查找路径环境变量 AIX                 LIB_PATH LINUX          ...总结: 编译静态库时先使用-c选项,再利用ar工具产生.编译动态库的方式依不同版本的UNXI而定。隐式调用动态库与静态库的用法相一致,而显示调用动态库则需要借助动态加载共享库函数族。...隐式调用动态库和静态库使用方法一致,使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?

    17.3K21
    领券