GCC学习笔记(二)--静态库与共享库

本文详细介绍了静态库和共享库的概念及其特点,包括它们的制作和使用方法。探讨了这两种库如何帮助提高代码的重用性和模块化,并讲解了如何设置库的搜索路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/include
2. /usr/local/include

3.2.库文件的默认位置

1. /usr/lib
2. /usr/local/lib

4.静态库的制作与使用

4.1.静态库的制作

使用ar将多个.o文件打包成.a文件,.a文件就相当于.o文件的集合。

ar rcs libtest.a test1.o test2.o

其中rcs命令的含义如下:
r 代表 replace
c 代表 create
s 代表 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.o
gcc -Wall -g -fPIC -c test2.c -o test2.o
gcc -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 可执行程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值