linux动态库和静态库的区别?
动态链接库和静态链接库一般是编译集成一系列的接口(函数)
在程序源代码编译完成后通过编译器编译并通过链接器与这些库进行链接
动态链接库与静态链接库的区别在于链接器在进行链接时静态库会被直接编译进程序里
而动态链接库并不会,我们这里将这些链接库称作依赖(动态库和静态库)
程序的运行需要这些依赖,程序在静态链接后该程序本身便已包含该依赖
而动态链接后的程序本身本不包含该依赖,这些依赖需要执行者自行安装进操作系统(动态库、运行时库)
程序运行时会动态地加载这些库
linux上动态库一般的后缀后为.so
静态库一般的后缀为.a
由于静态链接会直接将库编译进程序里所以静态编译后的程序相较于动态链接所要大
这就是因为静态链接会将链接库编译进程序里的原因,所以占用就要大了
出于这种原因,静态库不易于维护与更新,如果链接库中有实现有bug等需要更新则需要更新整个程序,因为静态库被编译进程序中了
但动态库就没有这种情况了,因为动态库是程序运行时动态加载的,所以我们只需要更新动态库而不需要更新所有依赖该库的程序(软件)
另一方面,很多程序的开发都会使用到相同的链接库,也就是很多程序(软件)会有相同的依赖
如果将这些依赖全部静态编译的话将会造成存储资源占用过多而造成资源浪费
而使用动态库的方式这些程序(软件)则可以共享一个链接库,而不需要每个程序都带一个链接库,这样就大大地减少了存储资源占用空间
linux标准库是动态还是静态?
编译器的默认设置是连接动态库,这就要求在程序执行的时候需要的动态库必须存在。改变编译选项可以变为静态连接,这样生成的程序运行时不需要库的支持,但是文件的尺寸一般较大。
linx的C标准库都有,看你自己喜欢哪样用哪样。
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
linux下的动态链接库和静态链接库到底是个什么鬼?
动态库和静态库都是一组函数集合,打包在一起供应用程序调用,区别是:静态库名称一般为xxx.a,在编译时和应用程序链接在一起,这样的应用程序占用空间较大。动态库名称一般为xxx.so,对于动态库即可以在编译时链接,也可以使用dlopen()/dlsym()/dlclose()函数在运行时调用,后种方式占用空间较小,且可以实现动态库在进程间共享,只在内存中保留一份,减少了内存开销。
Linux文件怎么查看是否采用动态库?
可以通过使用ldd命令来查看Linux文件是否采用了动态库。ldd命令会列出文件所依赖的所有动态库,并显示它们的路径。如果文件依赖的库都是动态库,那么它就是采用了动态库。如果文件没有依赖任何动态库,那么它就是静态文件。通过查看文件是否采用了动态库,可以更好地了解它的运行机制和依赖关系,从而更好地进行调试和优化。

