发布文章 博文管理我的博客退出 Trash Temp c++继承 const的 static----数据 动态和静态库 动态库和静态库 静态库和动态库的简单 引用 运算符重载简单 # 静态库和动态库
通常习惯把公用的函数制成函数库
函数库分为静态库和动态库。
- 静态库(.a):程序在编译连接的时候把库的代码链接到到可执行文件中。程序运行的时候不在需要静态库
- 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享库的代码。动态库是一个运行时库,需要在程序运行的时候也加载到内存中,并且加载的过程是操作系统干的,回去指定位置加载动态库,要去指定位置才可以运行程序
###动态链接和静态链接
静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。
动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能
库里面不能存在主函数,因为库封装好后被程序拿来用的,如果里面在有一个主函数,则会出现问题。
** 静态库的生成**
- 将所有的.o文件打包到一起(即程序在gcc生成.o文件后,就可以调用命令生成库)
生成静态库: ar -cr lib***.a .o
-c 创建
-r 模块替换
- 查看静态库:objdump -S lib***.a
###动态库的生成
- 在编译时(gcc时)加上选项 -fPIC(考虑为什么要加)
- 生成动态库:
编译指令: gcc -fPIC -c test.c -o test.o
生成动态库指令:gcc --shared -o libtest.so test.o
- –share是生成动态库的gcc链接选项,没有这个将认为是生成可执行文件
- 查看动态库:objdump -S lib***.so
链接动态库(或静态库)----即使用库
- 生成一个动态库
- 链接动态库
指令:gcc main -L -l库名
选项:
-l后跟库名
-L ,指定库的路径