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

虽然包含静态库,但在运行时仍链接到同名动态库

在软件开发中,静态库和动态库是常见的代码库形式,用于在程序运行时提供所需的函数和资源。

静态库是一组预编译的目标文件的集合,这些目标文件包含了函数和数据的实现。静态库在编译时被链接到程序中,成为程序的一部分。它们通常以.a(Unix/Linux)或.lib(Windows)为扩展名。

动态库是一组在运行时加载的目标文件,它们包含了函数和数据的实现。动态库在程序运行时被链接到程序中,可以在程序运行过程中被加载和卸载。它们通常以.so(Unix/Linux)或.dll(Windows)为扩展名。

虽然静态库在编译时被链接到程序中,但在运行时仍然需要链接到同名的动态库。这是因为静态库中的函数和数据实现可能依赖于动态库中的其他函数和数据。因此,即使静态库已经被链接到程序中,但在程序运行时仍然需要动态库的支持。

静态库和动态库各有优势和应用场景。静态库在编译时被链接到程序中,使得程序在运行时不依赖于外部库的存在,可以方便地在不同的环境中部署和运行。动态库在运行时加载,可以实现代码共享和动态更新,减少内存占用和磁盘空间。动态库还可以提供插件机制,允许程序在运行时加载和卸载功能模块。

对于静态库和动态库的选择,可以根据具体的需求和场景进行权衡。如果程序需要独立运行,不依赖于外部库,或者需要静态链接以提高性能和安全性,可以选择静态库。如果程序需要动态加载和更新功能模块,或者需要共享代码和资源,可以选择动态库。

腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储、人工智能等。具体推荐的产品和产品介绍链接地址可以根据具体的需求和场景进行选择。

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

相关·内容

gcc编译器参数_gcc for c4droid

只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态名,gcc将会从静态中将公用函数连接到目标文件中。...# 我们删除静态文件试试公用函数hello是否真的连接到目标文件 hello中了。...# 程序照常运行,静态中的公用函数已经连接到目标文件中了。 我们继续看看如何在Linux中创建动态。我们还是从.o文件开始。...快看看错误提示,原来是找不到动态文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态文件。若找到,则载入动态,否则将提示类似上述错误而终止程序运行。...这也进一步说明了动态在程序运行时是需要的。 我们回过头看看,发现使用静态和使用动态编译成目标程序使用的gcc命令完全一样,那当静态动态同名时,gcc命令会使用哪个文件呢?

95030

【linux】gcc makefile

,这样就能实现函数“printf”了,而这也就是链接的作用 静态是指编译链接时,把文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要文件了。...性能:在某些情况下,静态链接的应用程序启动和运行速度可能会更快,因为避免了运行时解析符号的开销。 缺点: 文件大小:可执行文件会包含所有静态链接的的代码,这会显著增加文件大小。...缺点: 运行时依赖:程序运行时必须能够访问它所依赖的动态。共享动态,但是一旦动态缺失,所有的动态链接这个的程序,都无法执行了!...启动时间:由于需要在运行时加载外部动态链接的应用程序可能启动较慢。 文件 静态:通常以 .a (Archive) 格式存储,是多个目标文件的集合。...动态运行时被加载,可以被多个程序共享。

5010
  • 静态链接动态链接的区别

    只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态名(是mymath 而不是libmymath.a ),gcc将会从静态中将公用函数连接到目标文件中...这也进一步说明了动态在程序运行时是需要的。...在使用时应包含的头文件Winbase.h(include Windows.h)dlfcn.h5、特殊情况我们回过头看看,发现使用静态和隐式方式使用动态时编译成目标程序使用的gcc命令完全一样,那当静态动态同名时.../main运行的结果中很容易知道,当Linux静态和Linux动态同名时, gcc命令将优先使用动态。...既可以是静态也可以是动态的常见的三种符号:①在库中被调用,但没有在库中定义(表明需要其他支持),用U表示②在库中定义的函数,用T表示③“弱态”符号,他们虽然在库中被定义但是可能被其他同名的符号覆盖

    8.2K21

    【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

    进行的动态链接实际上也使用了静态链接来实现 ),一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,中的函数和数据并不复制到可执行文件中...函数分为静态动态两种。静态在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态。...动态在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本节主要通过举例来说明如何在Linux中创建静态动态,以及使用它们。.../hello 会提示出错,因为虽然连接时用的是当前目录的动态,但是运行时,是到/usr/lib中找文件的,将文件libmyhello.so复制到目录/usr/lib中就OK了。...这也进一步说明了动态在程序运行时是需要的。 我们回过头看看,发现使用静态和使用动态编译成目标程序使用的gcc命令完全一样,那当静态动态同名时,gcc命令会使用哪个文件呢?

    4.8K52

    【linux学习指南】Linux编译器 gcc和g++使用

    动态: .so (linux).dll(windows) 静态: .a (linux).lib 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的文件中去了,在没有特别指定时.../lib64/ld-linux-x86-64.so.2: 这是动态链接器(或加载器),负责在程序运行时加载所需的共享并进行链接。它的加载地址是 0x00007f11a5540000。...函数一般分为静态动态两种。 静态是指编译链接时,把文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要文件了。...,连接对应的静态 动态与之相反,在编译链接时并没有把文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载,这样可以节省系统的开销。...虽然它也可以编译 C++ 代码,但在处理 C++ 特有的语法和特性时,可能会出现问题。 g++:专门用于编译 C++ 语言程序。它能够正确处理 C++ 的语法、特性和标准

    16010

    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

    包含二进制代码和数据,其形式可以被直接复制到内存并执行。   共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时动态地加载进内存并链接。   ...同时,在分配栈、共享和堆段运行时地址的时候,链接器还会使用地址空间布局随机化。虽然每次程序运行时这些区域的地址都会改变,它们的相对位置是不变的。   ...共享目标文件(共享)是在运行时动态链接器链接和加载的,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用dlopen的函数时。   ...多个目标文件可以被连接到一个单独的静态中。链接器用来解析其他目标模块中的符号引用。许多链接器通过从左到右的顺序扫描来解析符号引用,这是另一个引起令人迷惑的链接时错误的来源。...被编译为位置无关代码的共享可以加载到任何地方,也可以在运行时被多个进程共享。为了加载链接和访问共享的函数和数据,应用程序也可以在运行时使用动态链接器。

    2.6K31

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

    静态在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态。...动态在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在 一  静态 这类的名字一般是libxxx.a;利用静态函数编译成的文件比较大,因为整个....o为扩展名的中间目标文件名,可以多个并列 参数        意义 -r            将objfile文件插入静态尾或者替换静态同名文件 -x            从静态文件中抽取文件...隐式调用动态静态使用方法一致,使用静态和使用动态编译成目标程序使用的gcc命令完全一样,那当静态动态同名时,gcc命令会使用哪个文件呢?...通过测试可以发现,当静态动态同名时, gcc命令将优先使用动态.为了确保使用的是静态, 编译时可以加上 -static  选项,因此多第三方程序为了确保在没有相应动态时运行正常,喜欢在编译最后应用程序时加入

    16.9K21

    C语言---静态VS动态

    的位置,所以一个.c源文件如果包含多个头文件,头文件的顺序是需要注意的地方。...静态的代码在编译的过程中已经载入到可执行文件中,所以最后生成的可执行文件相对较大。 动态的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小。...静态动态的最大区别是,静态链接的时候把直接加载到程序中,而动态链接的时候,它只是保留接口,将动态与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度。...静态在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态动态在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。...是已.o为扩展名的中间目标文件名,可以多个并列 参数 意义 -r 将objfile文件插入静态尾或者替换静态同名文件 -x 从静态文件中抽取文件

    8.9K45

    CSAPP---第七章-链接

    为了防止局部静态变量a和b同名,编译器还进行了重命名处理 局部变量在运行时的栈中被管理,链接器对此类符号不感兴趣,所以不会出现在符号表中。...将所有标准c函数都放在一个可重定位目标模块中,应用程序直接把该模块链接到他们的可执行文件中。 缺点: 每个可执行文件都包含一份标准函数集合的完全副本,对磁盘和内存空间浪费特别大!...---- 动态链接 静态缺点: 需要定期维护和更新静态,然后显示地将他们的程序与更新了的重新链接 标准中的I/O函数,基本上每个c程序都会引用,那么意味着,在运行时,这些函数代码会被复制到每个运行的进程的文本段中...---- 运行时动态链接和加载某个共享 应用程序还可能在它运行时要求动态链接器加载和链接某个共享,而无需在编译时将那些接到应用中。 动态链接是一项强大有用的技术。...多个目标文件可以被连接到一个单独的静态中。链接器用来解析其他目标模块中的符号引用。许多链接器通过从左到右的顺序扫描来解析符号引用,这是另一个引起令人迷惑的链接时错误的来源。

    86710

    Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态的适配

    除此之外,凡是后面带“_static”的,表示其是一个静态链接的运行时运行时的代码包含在编译后的程序中);而凡是后面带“_shared”的,表示其是一个动态链接的运行时运行时在程序运行时动态加载进来...如果去除动态静态链接的因素,则除了默认的“system”运行时之外,还有所谓的“gabi++”运行时、“stlport”运行时和“gunstl”运行时。...主要是两种,静态链接,动态链接:     动态链接,是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。...静态链接,是把所有用到的函数全部链接到 .so 文件中;   重点来了,上面说到了,静态链接是会把所需要的都搞到exe中,其实不然,这个说法是早期的了,对于现在的 Android 发展来说,为了使程序方便扩展...,具备通用性,已经采用插件形式来链接动态,编译时的静态动态链接仅仅是程度问题。

    1.9K100

    e语言-E语言 5.0 正式版(精简安装版)

    静态编译后的易语言可执行程序(exe)和动态链接(dll),运行时不再依赖任何支持文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报...为实现静态编译e语言,易语言编译器、核心支持、集成开发环境(IDE)等均有重大更新,支持开发架框有扩展性调整,绝大多数官方支持都已针对静态编译完成自身改造并提供静态。   ...第三方支持,由源代码作者按照静态编译技术文档(参见)完成自身改造并提供静态后,可支持静态编译。外部OCX组件和COM组件,不支持静态编译。   ...静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态接到一个EXE/DLL中的支持e语言,该支持中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持访问...这是因为代码被分别静态链接接到各个独立模块(EXE/DLL)中。 本文共 536 个字数,平均阅读时长 ≈ 2分钟

    1K30

    移植speexdsp到OpenHarmony标准系统②

    /*记录同名动态静态相关信息的la文本文件*/├── libspeexdsp.so -> libspeexdsp.so.1.5.2 ├── libspeexdsp.so.1 -> libspeexdsp.so...(共享动态文件必须以lib开头,以.so结尾lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息la: 使用libtool编译出的文件,其实是个文本文件,记录同名动态静态的相关信息知识拓展...:函数分为静态*a和动态*.so两种:①静态在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态。...②动态在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。...在linux中,*.la是记录同名动态静态相关信息的文本文件。

    6420

    c++动态静态的区别_静态库里面包含动态

    实际上静态本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。...在Windows下显式调用动态 应用程序必须进行函数调用以在运行时显式加载 DLL。...它们虽然在库中被定义,但是可能被其他中的同名符号覆盖,用W表示。...l 静态在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态,因此体积较大。...l 动态在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。

    1.8K30

    【Linux】--- Linux编译器-gccg++、调试器-gdb、项目自动化构建工具-makeMakefile 使用

    函数一般分为静态动态两种。 静态是指编译链接时,把文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要文件了。...其后缀名一般为".a" 动态与之相反,在编译链接时并没有把文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载,这样可以节省系统的开销。...动态一般后缀名为".so",如前面所述的 libc.so.6就是动态。gcc在编译时默认使用动态。完成了链接之后,gcc就可以生成可执行文件,如下所示。...验证: -static指令,作用是链接时使用静态链接: 2. ldd 可执行指令,作用是查看链接的: file filename指令,查看链接属性: 动态 && 动态链接的优缺点:1....共享动态,但是一旦动态缺失,所有的动态链接这个的程序,都无法执行! 2. 节省资源。 静态 && 静态链接的优缺点:1. 一旦形成,与无关。

    36020

    深入浅出GCC编译器

    一、GCC交叉编译工具 GCC编译工具包含了GCC编译器在内的一整套工具,主要包含了GCC编译器、Binutils工具集、glibc标准函数。...链接有两种方式,我们不加任何选项参数默认使用的是动态链接,使用静态链接要加一个选项 –static。 动态链接:动态是指在应用程序运行时才去加载外部的代码,所以动态链接生成的程序比较小。...静态链接:它在编译阶段就会把所有用到的打包到自己的可执行程序中,生成的程序比较大。 通过对比动态链接生成的a.out和静态链接生成的h_s可以看到其所占空间大小的差距。...libxxx.so 或 libxxx.a ,所以这个参数的使用方法是直接加名 -lxxx ,具体使用方法将在我Linux专栏的另一篇文章《自己动手做动态静态》中详细介绍。...(5)-L 包含路径 指定动态静态的路径,后面直接加路径即可。具体使用方法将在我Linux专栏的另一篇文章《自己动手做动态静态》中详细介绍。

    24210

    iOS里的动态静态

    ) 系统动态:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(图2所示) 上图中的绿框表示app的可执行文件。...动态的作用 应用插件化: 每一个功能点都是一个动态,在用户想使用某个功能的时候让其从网络下载,然后手动加载动态,实现功能的的插件化 虽然技术上来说这种动态更新是可行的,但是对于AppStore...iOS8之后虽然可以上传含有动态的app,但是苹果不仅需要你动态和app的签名一致,而且苹果会在你上架的时候再经过一次AppStore的签名。...下图表示了静态,自己创建的动态和系统动态: 签名 系统在加载动态时,会检查 framework 的签名,签名中必须包含 TeamIdentifier 并且 framework 和 host app...这些生成的动态将链接到主项目给主工程使用,但是我们上面说过动态需要在主工程target的General -> Embedded Binaries中添加才能使用,而我们并没有在Embedded Binaries

    2.6K20

    【Linux】Linux编译器-gccg++使用

    验证是动态链接还是静态链接 先生成可执行程序: gcc mytest.c -o mytest 此时我们查看可执行程序的动态 函数一般分为静态动态两种 1.动态 动态在编译链接时并没有把文件的代码加入到可执行文件中...,而是在程序执行时由运行时链接文件加载,这样可以节省系统的开销。...形成的可执行程序小(节省资源,内存,磁盘,网络) 2.静态 静态是指编译链接时,把文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要文件了。.../lib64/lib.a静态 动态链接只能找动态静态链接只能找静态(一般而言,系统会自动携带动态,因为系统运行需要动态静态如果不存在,需要自己安装!)....h(告诉我们怎么用) 标准的动静态.so/.a(告诉我们方法实现) 我们的程序通过使用包含头文件,然后链接别人的来实现将我的代码+的代码形成可执行程序!!!

    2.1K30

    【Linux】编译器-gccg++

    最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去...函数一般分为静态动态两种 静态是指编译链接时,把文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要文件了。...其后缀名一般为“.a” 动态与之相反,在编译链接时并没有把文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载,这样可以节省系统的开销。...gcc hello.o –o hello gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证 上方是通过使用静态进行链接,静态需要我们自己安装,输入 sudo yum install...-shared 此选项将尽量使用动态,所以生成文件比较小,但是需要系统由动态 .

    10310

    Linux编译相关命令

    很大,它已经把各种依赖的东西都包含进来 (5) -shared (-G) 此选项将尽量使用动态,为默认选项 优点:生成文件比较小 缺点:运行时需要系统提供动态...三、静态动态的编译命令 1、生成动态静态 (1)得到hello.o g++ -c hello.cpp (2)得到静态myhello.a...-fPIC -shared hello.cpp -o libmyhello.so (5)使用动态 动态的时候和静态使用一样,唯一值得注意的是当目录中同时存在相同名称的动态静态时...3、如何解决运行时找不到动态的问题 (1)将动态添加到系统默认的搜索路径下,如/lib、/usr/lib (2)设置临时动态路径的环境变量,这种方法设置的是临时的,系统重启之后就没了...,可以通过修改配置文件/etc/ld.so.conf中指定的动态搜索路径,然后执行ldconfig命令来改变 (4)编译链接添加-WL,-rpath命令选项,将运行时动态的搜索路径记录在可执行程序中

    3.3K00
    领券