Linux 静态库 和 动态库的使用

静态库

1、概念

静态库 是在可执行程序运行之前就已经加入到执行代码中,成为执行程序的一部分;静态库的后缀一般是 .a作为后缀。

2、创建静态库

创建一个静态库,或者是要将目标代码加入到已经存在的静态库中,可以使用如下命令:
ar rcs libxxx.a hello.o
ar 是GNU 归档工具,rcs 表示(replace and create)

3、应用程序中使用静态库

使用gcc 的 -l 选项来指定静态库,使用 -L 选项来指定库文件的搜索路径。
样例
如果我们使用 目录/home/username/publiclibabc.a 静态库,则需指定静态库的目录 -L/home/username/public (注意 -L 后面是没有空格的),指定静态库 -labc

注意:
因为linux的gcc 默认链接动态库,但动态库不存在时,才链接静态库,若是需要强制指定静态库需要指定选项 -static

4、静态库链接时搜索路径顺序:

  • ld回去找GCC命令中的参数-L
  • 再去找GCC的环境变量LIBRARY_PATH
  • 再找内定目录/lib /usr/lib /usr/local/lib 这是当初compiler gcc时写在程序内的动态链接时、执行时搜索路径顺序

共享库

1、概念

共享库 是在程序执行期间需要调用到共享库的时候才加载到内存里面,可以被多个程序共享使用;每个共享库都有三个文件名:real namesonamelinker name

//real name
-rwxr-xr-x 1 root root  11511640  libavcodec.so.57.24.102
//soname
lrwxrwxrwx 1 root root   libavcodec.so.57 -> libavcodec.so.57.24.102
//linker name
lrwxrwxrwx 1 root root   libavcodec.so -> libavcodec.so.57.24.102

real name:真正的库文件,包含库文件的完整版本号
soname:符号链接的名字,只包含共享库的主版本号(主版本号相同,函数的接口是一致的);因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个共享库就可以用。
linker name:在编译链接时使用,gcc 的-L选项应该指定linker name所在目录

2、创建动态库

简单的创建动态库使用如下命令:
gcc -shared -fPIC abc.c -o libabc.so

3、加载共享库

链接路径
连接时找不到某一个函数,出现xxxxx undefined,应该就是连接时找不到相应的动态库,连接时动态库的路径如下:

  • 默认路径是:/lib, /usr/lib/, /usr/local/lib
  • -L: 指定连接时动态库的路径
  • LD_LIBRARY_PATH:指定连接路径

运行路径
运行应用程序时出现 error while loading shared libraries,则是加载时找不到相应的动态库

  • ELF可执行文件中动态段中DT_RPATH所指定的路径。这实际上是通过一种不算很常用,却比较实用的方法所设置的:编译目标代码时,可以对gcc加入链接参数-Wl,-rpath指定动态库搜索路径;
  • 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  • /etc/ld.so.cache中所缓存的动态库路径(如果支持ld.so.cache的话)。这可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径来改变;
  • 默认的动态库搜索路径/lib;
  • 默认的动态库搜索路径/usr/lib。

样例

1、创建一个目录 calc

mkdir /home/username/calc

2、创建1个c文件和1个.h,实现加减乘除

文件 calc.c

int add(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{
    return a-b;
}

int mul(int a, int b)
{
    return a*b;
}

int dive(int a, int b)
{
    return a/b;
}

calc.h

#ifndef CALC_H_
#define CALC_H_

int add(int a, int b);
int sub(int a, int b);
int dive(int a, int b);
int mul(int a, int b);

#endif

3、制作静态库

    gcc -c calc.c -o calc.o
    ar rcs libcalc.a calc.o

4、制作共享库

    gcc -c -fPIC calc.c
    gcc -shared -Wl,-soname,libcalc.so.1 -o libcalc.so.1.10 calc.o

5、设置共享库加载路径

  • 打开共享库路径配置文件:sudo vi /etc/ld.so.conf
  • 最后一行添加mycal路径:/home/username/calc
  • 更新共享库加载路径:sudo ldconfig -v
  • 此时可以看到自动创建出来了soname libcalc.so.1
  • 手动添加link name:ln -s libcalc.so.1.10 libcalc.so

6、测试

编写测试文件main.c,分别去链接静态库和共享库,进行测试
文件 main.c

#include <stdio.h>
#include "common.h"
int main(void)
{
    printf("%d\n", add(5, 3));
    return 0;
}

链接动态库: gcc main.c -o main -Wl,-rpath=./ -lcalc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容