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.对比

项目 静态库 共享库 文件后缀 .a .so 或 .sa 何时链接 编译时 运行时 库代码 每个程序加载一份库代码 多个程序共享一份库代码

当同名的静态库与共享库同时存在时,优先使用共享库。

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
原创粉丝点击