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

linux 动态库依赖静态库

基础概念

在Linux系统中,动态库(Shared Libraries)和静态库(Static Libraries)是两种不同类型的库文件。

静态库

  • 静态库是以.a为后缀的归档文件(Archive)。
  • 它们在编译时被链接到程序中,成为程序的一部分。
  • 静态库的优点是程序运行时不依赖于外部库文件,便于分发和部署。
  • 缺点是会增加可执行文件的大小,并且每次更新库都需要重新编译程序。

动态库

  • 动态库是以.so(Shared Object)为后缀的文件。
  • 它们在程序运行时被加载到内存中,多个程序可以共享同一个动态库实例。
  • 动态库的优点是可以节省磁盘空间和内存,便于库的更新和维护。
  • 缺点是程序运行时需要依赖外部的动态库文件。

动态库依赖静态库

在Linux中,动态库可以依赖于静态库。这意味着在编译动态库时,可以将静态库的内容链接到动态库中。这样,使用该动态库的程序就不需要再单独链接这个静态库。

相关优势

  1. 简化部署:动态库依赖静态库可以减少程序运行时对外部文件的依赖,简化部署过程。
  2. 提高性能:静态库的内容被直接嵌入到动态库中,减少了运行时的查找和加载时间。
  3. 兼容性:通过将静态库嵌入动态库,可以确保在不同环境中的一致性,避免版本冲突。

类型与应用场景

类型

  • 完全静态链接:静态库的所有内容都被嵌入到动态库中。
  • 部分静态链接:只将静态库的部分内容嵌入到动态库中。

应用场景

  • 嵌入式系统:在资源受限的环境中,通过静态链接减少运行时的依赖。
  • 高性能计算:为了提高性能,将关键代码静态链接到动态库中。
  • 跨平台应用:确保在不同操作系统或硬件平台上的一致性。

遇到的问题及解决方法

问题:动态库依赖静态库时,可能会出现链接错误或运行时找不到符号的问题。

原因

  • 未正确链接静态库:在编译动态库时,未指定正确的静态库路径或名称。
  • 符号冲突:静态库中的符号与动态库或其他依赖库中的符号冲突。
  • 版本不匹配:静态库的版本与动态库或其他依赖库不兼容。

解决方法

  1. 确保正确链接
  2. 确保正确链接
  3. 其中,-L指定静态库的路径,-l指定静态库的名称(去掉前缀lib和后缀.a)。
  4. 检查符号冲突: 使用nm命令查看静态库和动态库中的符号:
  5. 检查符号冲突: 使用nm命令查看静态库和动态库中的符号:
  6. 确保没有重复的符号定义。
  7. 版本管理: 使用包管理工具(如aptyum)或版本控制系统来管理库的版本,确保所有依赖库的版本兼容。

示例代码

假设我们有一个静态库libmath.a和一个动态库libcalculator.solibcalculator.so依赖于libmath.a

编译静态库

代码语言:txt
复制
gcc -c math.c -o math.o
ar rcs libmath.a math.o

编译动态库

代码语言:txt
复制
gcc -shared -o libcalculator.so calculator.c -L. -lmath

使用动态库

代码语言:txt
复制
// main.c
#include "calculator.h"

int main() {
    int result = add(2, 3);
    printf("Result: %d\n", result);
    return 0;
}
代码语言:txt
复制
gcc main.c -L. -lcalculator -o main
LD_LIBRARY_PATH=. ./main

通过这种方式,可以确保动态库正确依赖并使用静态库中的功能。

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

相关·内容

【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
    领券