浅尝辄止3-Linux基础-加载库

当我们用C/C++做Linux开发时,肯定会遇到加载库的问题,具体加载的方法要根据具体情况决定。

库文件形式

常见的C/C++库文件有2中形式,即*.a和*.so文件,前者是静态链接库,后者是动态链接库。

静态链接库

静态链接库的文件名一般为*.a,这个a就是archive,即存档的意思。这个文件的内容实际上是*.o的打包。

动态链接库

动态链接库的文件名一般为*.so,相当于windows环境里的*.dll文件。so就是shared object,有共享的意思。这个文件的内容里有很多符号信息,是动态链接过程中的必要信息。

两种库的特点

首先说静态,动态是指什么。他们的宾语都是链接,所以这两种库的链接情况不同。所谓链接,就是你的代码在引用一个符号的时候,链接器找到那个符号的动作。
静态链接就是找符号的动作在编译阶段就完成了。为什么能这么早搞定呢?因为静态链接的结果是把整个库的内容都放到目标文件里了,所有符号的完整信息都在自己手里了,找符号还不容易么?
动态链接就是找符号的动作要在运行时完成,目标文件里肯定没有符号的完整信息,所以要快用的时候才现找。那么问题又来了,自己没带着的东西,用的时候去哪找呢?当然是在目标运行环境上找啦。只要目标运行环境里有对应的库,并且在加载器的搜索路径下,就可以找到的。
总的来说,使用动态链接库的程序,目标文件小,省磁盘空间,当然,前提是目标运行环境有这个库,如果拿不准,那就只能用静态链接库。

库的生成

静态链接库生成要用ar命令一般形式是
ar -r lib<lib name>.a <object file>.o

例如对于代码文件test.c,如下命令可以得到libtest.a

gcc -c -o test.o test.c
ar -r libtest.a test.o
动态链接库直接用gcc就可以生成,一般形式为
gcc -c -fPIC *.c -o *.o
gcc -shared -o lib*.so *.o

例如对于代码文件test.c,如下命令可以得到libtest.so

gcc -c -fPIC -o test.o test.c
gcc -shared -o libtest.so test.o

库的使用

两种库的使用有一种共通的编译方法

gcc *.c -L<dir0> -L<dir1> -l<lib name0> -l<lib name1> -o a.out

-L是要指定库的搜索路径,编译环境中的LIBRARY_PATH已经包含的路径就不用指定了。
-l是要指定库的名字,例如库文件是libtest.so或libtest.a,那就要写成-ltest
那么问题来了,如果两种链接库同时存在,编译器会用怎样的链接方式呢?答案是动态链接,如果要优先使用静态链接,要用-static

dl*系列函数

上面的编译方法,要求必须有库存在编译环境中。其中,静态库的内容必须是正确的代码,动态库的内容的符号必须是正确的,函数内部的实现方法可以不正确,因为在运行环境中会调用正确的库。
当编译环境中没有需要的动态库文件怎么办呢?动态加载库还有一种使用方法,在代码逻辑中加载,可以使用库函数DLOPEN(3)以及相关函数,相关例子代码网上不少,我就懒得写了。

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

推荐阅读更多精彩内容