其实我们平常写一些C或C++的代码的时候,在链接过程都会用到动静态库,因为一些基础的代码我们是不用写的(比如输入输出函数),我们只需要包个头文件,这些库和我们的编译好的代码一起链接后才会形成可执行程序
那么我们用到的库分为两种,静态库和动态库;链接方式于是就分为了动态链接和静态链接
动态链接是库就一份,可执行程序中只存有库函数的地址,要调用的话可以根据地址去调用函数
静态链接则是直接把库拷贝到可执行程序中,这就使可执行程序在运行时不需要库了
因为动静态库的差异,它们是有各自的优缺点的
动态库:
优点:比较节省资源,不会出现太多的重复代码(这里的资源可不仅仅指的是磁盘资源,还有运行时的内存资源,传输时的网络资源)
缺点:对库的依赖性强,一旦少了这个库,那么用到这个库的程序都无法运行
静态库:
优点:不依赖库,同类型平台都可以运行使用
缺点:可执行程序体积比较大,比较浪费资源
动静态库在不同的操作系统下后缀也是不一样的
库 | Linux | Windows |
动态库 | .so | .dll |
静态库 | .a | .lib |
我们在gcc/g++下是默认使用动态链接的,有一个命令可以查看文件依赖的库(ldd+文件名),还有一个命令可以查看文件的具体信息(file+文件名),当然了,我们如果想使用静态链接的话也是有命令的,gcc后加选项-static,我们下面来试验一下两种链接方式有什么区别
有的云服务器是默认没有静态库的,我们要用yum安装一下
yum install -y glibc-static libstdc++-static
我们安装完之后可以在下面的路径看到
这是我将test.c用两种链接方式形成的可执行程序,可以看到静态链接形成的可执行程序是比较大的
也可以看到动态链接确实是需要依赖一些库的,而静态链接不需要
也可以看到,画起来的部分确实写得是静态链接,而上面写的是动态链接