GCC学习笔记(二)--静态库与共享库
来源:互联网 发布:linux 定时唤醒 编辑:程序博客网 时间:2024/05/17 23:35
GCC学习笔记(二)–静态库与共享库
1.什么是静态库/共享库
1.1.静态库
概念
1. 以.a为文件后缀。2. 程序在编译【链接时】可以将静态库中的代码链接到可执行文件中。
特点
1. 运行时不再需要。2. 链接静态库中代码导致可执行文件体积增大,占用磁盘空间。3. 加载时占用内存,多程序使用时,需要加载多份静态库。
1.2.共享库
概念
1. 以.so或.sa为文件后缀。2. 程序在【运行时】链接共享库的代码。3. 多个程序共享使用库的代码。
特点
1. 多个程序共享。2. 运行时链接,共享库不可删除。3. 节省磁盘空间。4. 节省内存。
1.3.对比
当同名的静态库与共享库同时存在时,优先使用共享库。
2.为什么使用库
1. 便于模块化开发2. 代码可重用性高3. 代码可维护性强
3.头文件/库文件的默认位置
3.1.头文件默认位置
1. /usr/include2. /usr/local/include
3.2.库文件的默认位置
1. /usr/lib2. /usr/local/lib
4.静态库的制作与使用
4.1.静态库的制作
使用ar将多个.o文件打包成.a文件,.a文件就相当于.o文件的集合。
ar rcs libtest.a test1.o test2.o其中rcs命令的含义如下:r 代表 replacec 代表 creates 代表 save
4.2.静态库的使用
(1)使用-L指定库路径
gcc -Wall -g main.c -o main -L. -ltest说明: -L. : -L库路径,“.”表示在当前文件路径下链接库。 -ltest : -l库名称,当链接库时,只要库名即可,可去掉lib以及版本号。 通常还需要使用-I选项指定头文件的位置。
(2)将静态库路径配置到默认的搜索路径中,无需使用-L选项
gcc -Wall -g main.c -o main -ltest
4.3.设置静态库的搜索路径
设置静态库搜索路径有以下三种方法,这三种方法的优先级依次递减。
1. 从左到右搜索-I -L指定的搜索路径2. 由环境变量指定的路径,仅当前用户有效 vim ~/.bash_profile export LIBRARY_PATH=/my_define_path #设置静态库的搜索路径 #export C_INCLUDE_PTAH=/my_define_path #设置C头文件的搜索路径 #export CPP_INCLUDE_PTAH=/my_define_path #设置C++头文件的搜索路径 . ~/.bash_profile // 生效3. 由系统指定的路径(将.a文件到系统共享库路径,一般指/usr/lib)
5.共享库的制作与使用
5.1.共享库的制作
gcc -Wall -g -fPIC -c test1.c -o test1.ogcc -Wall -g -fPIC -c test2.c -o test2.ogcc -shared -fPIC test1.o test2.o -o libtest.so说明: -shared 表示生成共享库格式 -fPIC 产生位置无关码(position independent code) 库名规则 libxxx.so
5.2.共享库的使用
使用共享库libtest.so可以成功生成test可执行文件。
gcc -Wall -g main.c -o test -L. -ltest
但是执行test文件会报如下的错误信息。
[root@localhost xxx]# ./test ./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
由于共享库是运行时加载,因此需要进一步配置共享库的环境变量。
5.3.设置共享库的环境变量
1. 拷贝.so文件到系统共享库路径下(一般指/usr/lib)2. 执行ldconfig命令更新配置
5.4.查看可执行程序使用了哪些共享库
ldd 可执行程序
0 0
- GCC学习笔记(二)--静态库与共享库
- GCC与静态库、共享库以及动态加载库
- linux静态库与共享库(二)
- linux静态库与共享库(二)
- gcc共享库和静态链接库
- 静态库和共享库(二)
- gcc -l 链接共享库(动态/静态共享库)
- gcc 学习笔记-创建静态库-创建动态库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- GCC系列之 静态库(二)
- UNIX再学习 -- 静态库与共享库
- gcc编译-同时包含静态库和共享库
- gcc.g++ 编译调用共享库 静态库
- ffmpeg音视频分离命令
- Win10总是弹出Windows安全窗口要求输入用户名和密码的解决方法
- Idea下,JSP语句不识别的解决
- CODEVS_3027 线段覆盖2
- 蓝桥杯 入门训练 Fibonacci数列 JAVA
- GCC学习笔记(二)--静态库与共享库
- C++单利模式
- 山区修路
- GreenDao 3.1 应用
- Extreme (II)
- java中的接口(interface)
- Retrofit 的使用
- CODEVS 1166 矩阵取数游戏
- qscoj 66 ||2017 UESTC Training for Data Structures D(离线+树状数组)