1. 简单介绍
在给别人使用函数时,但是不想让别人看到函数具体实现的代码内容(不开源),
就把这些源代码打包在一起,生成一个库文件
在使用的时候就可以直接通过这个库文件和头文件来调用,不需要平台的环境
本质上来说库是一种可执行代码的二进制形式,在不同平台也是不兼容的(Windows和Linux)
2. 静态库
Linux:
后缀名: .a
Windows:
后缀名:.lib
使用静态库时,只需要将静态库文件添加到项目中,
并在源代码中包含相应的头文件,就可以直接使用库中的函数了
但是需要注意:静态库只能连接到一个程序中
如果要在多个项目中都要使用,就需要将静态库文件分别添加到每个项目中
3. 动态库
Linux:
后缀名: .so
Windows:
后缀名:.lib和.dll
使用动态库时,需要在编译的时候链接.lib文件,该文件包含了函数所在的.dll文件
还有文件中函数位置的信息(索引),使得程序在运行时可以动态连接.dll文件,调用其中函数
动态库(.dll)用于动态编译,将实现过程放到.dll文件中,这样该文件就可以提供给多个程序使用
4. 库的创建和调用(Windows + CMake)
静态库
创建
生成静态库:
add_library(库名 链接库类型(STATIC) 资源文件)
调用
-
静态库目录:
link_directories(静态库的头文件目录)
-
具体连接的库名:
link_libraries(MathFun.lib)
动态库
创建
生成动态库:
add_library(库名 链接库类型(SHARED) 资源文件)
调用
-
连接库到可执行文件:
target_link_libraries(可执行文件名 库文件(.lib))
执行应用程序时,需要与.dll文件放在一起,才能调用库的内容
5. 动态库和静态库区别(Windows)
1. 载入代码时刻不同:
静态库:
编译时被载入,将整个静态库内容都拷贝到应用程序中
动态库:
编译时仅拷贝.lib中的引导信息,方便执行的时候,找到.dll文件中的函数
2. 应用程序大小不一样:
静态库:
编译将静态库内容拷贝过来,所以文件较大
动态库:
编译时仅拷贝引导信息,所以文件较小
3. 运行速度不一样
静态库:
直接运行应用程序就可以
动态库:
运行的时候还需要去调用库,所以速度相对较慢
4. 库文件程序变更
静态库:
需要重新编译,相对麻烦
动态库:
不影响