Linux 库的使用

1 基本概念

1.1 什么是库
 一种可执行代码的二进制形式,可以被操作系统载入内存执行。
1.2 库的种类
静态库:静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
动态库:可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
1.3 库的命名
 静态库的名字一般为libxxxx.a,其中 xxxx 是该lib的名称。
 动态库的名字一般为libxxxx.so.major.minor,xxxx 是该lib的名称,major是主版本号,minor是副版本号。

2 生成库例子

2.1 建立一个源文件: max.c,代码如下:

int max(int n1, int n2, int n3)
{
    int max_num = n1;
    max_num = max_num < n2? n2: max_num;
    max_num = max_num < n3? n3: max_num;
    return max_num;
}

2.2 建立 max.h ,输入以下代码:

#ifndef __MAX_H__
#define __MAX_H__

int max(int n1, int n2, int n3);

#endif

3.3 编译生成动态库:

gcc -fPIC -shared -o libmax.so max.c

gcc参数解析:

-fPIC:表示编译为位置无关代码,在可执行程序加载时可以存放在内存内的任何位置。若不使用该选项则编译后的代码是位置相关的代码,在可执行程序加载时是通过代码拷贝的方式来满足不同的进程的需要,没有实现真正意义上的位置共享。
-shared:指定生成动态链接库

3.4 编译生成静态库:

 gcc -c max.c
 ar rcu -o libmax.a max.o

c: 如果需要生成新的库文件,不要警告。
r: 代替库中现有的文件或者插入新的文件。
v:输出详细信息。

3 运行

3.1 建立测试程序,输入如下代码:

#include <stdio.h>
#include "max.h"

int main(int argc, char *argv[])
{
    int a = 10, b = -2, c = 100;
    printf("max among 10, -2 and 100 is %d.\n", max(a, b, c));
    return 0;
}

3.2 动态库的静态链接
编译生成可执行文件:

gcc main.c -o test_max ./libmax.so  

 注意,如果执行文件test_max的位置发一改变,则会出现以下错误:

./test_max: error while loading shared libraries: ./libmax.so: cannot open shared object file: No such file or directory

  找不到libmax.so,原来Linux是通过 /etc/ld.so.cache 文件搜寻要链接的动态库的。而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。

3.3 动态库的动态链接
(1)添加/etc/ld.so.conf.d/XXX.conf文件,终端执行以下命令

root@:/home/temp# touch /etc/ld.so.conf.d/my.conf

(2)在文件内添加动态库的目录,终端执行以下命令

root@:/etc/ld.so.conf.d# cat > my.conf << EOF
/home/temp
EOF

(3)保存退出,执行ldconfig使配置生效

root@:/home# ldconfig

(4)查看cache缓存是否存在链接库符号。
这里写图片描述
编译生成可执行文件:

gcc main.c -o test_max -L./ -lmax  

-L:指定链接库的路径,-L./ 表示要连接的库在当前目录中
-lmax:指定链接库的名称为max,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称.

 注意,此时执行文件test_max的位置发一改变,不会发生找不到库位置的情况。

4 相关命令

4.1 使用ldd工具,查看可执行程序依赖那些动态库或着动态库依赖于那些动态库:
这里写图片描述
4.2 使用nm工具,查看静态库和动态库中有那些函数名:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值