范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

静态库和动态库(Linux版)

  1静态库和动态库概述
  库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通常把库文件存放在/usr/lib或/lib目录下。Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so作为后缀,静态链接库通常以.a作为后缀。
  何为静态库和动态库?
  静态库(Static library, Statically-linked library, LIB)或称静态链接库,是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(static build)。其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的可执行文件中。
  动态库(Dynamic library, Dynamic-link library, DLL)或称动态链接库,是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。动态链接库可被多个程序同时使用。所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。
  一个程序编译成可执行的步骤:
  静态库和动态库的区别在链接阶段如何处理库,如果将库链接到目标代码中则是静态库,而将库链接载入推迟到程序运行的时期则是动态库,可以实现进程之间的资源共享。2 Linux创建和使用静态库
  前面已经介绍了静态库的概念,下面我们通过一个实例来看静态库的使用。2.1生成静态库
  1)这里准备了两个库的源码st1 、st2用它们来制作库libmytest.a,如下
  $ ls -l
  $ cat st1.c #include  void print1() {     printf("Hello!I am st1!  "); }
  $ cat st2.c #include  void print2() {     printf("Hello!I am st2! "); }
  $ cat main.c #include  int main(int argc, const char *argv[]) {     print1();     print2();      return 0; }
  2) 生成libmytest.a文件
  创建静态库用ar命令,它将很多.o转换成.a
  $ gcc -c st1.c st2.c
  $ ar crs libmytest.a st1.o st2.o
  $ ls -l
  $ file libmytest.a
  静态库文件libmytest.a已经生成,用file命令查看其属性,发现它确实是归档压缩文件。用ar -t libmytest.a可以查看一个静态库包含了那些obj文件:
  $ ar -t libmytest.a
  2.2使用静态库
  直接使用
  $gcc -o test main.c libmytest.a
  双L链接法
  $gcc -o test main.c -lmytest -L.(库所在目录,.表示当前目录)
  单L链接法(需要配置环境变量LIBRARY_PATH,把库放在所在目录配置)
  $gcc -o test main.c -lmytest
  前面我们已经写好了main.c,现在测试一下
  $ gcc -o test main.c -L. -lmytest
  $ ls -l
  $ ./test
  这里gcc的参数-L是告诉编译器库文件的路径是当前目录,-l是告诉编译器要使用的库的名字叫mytest。2.3静态库总结
  在一个头文件中声明静态库所导出的函数。
  在一个源文件中实现静态库所导出的函数。
  编译源文件,生成可执行代码。
  将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库文件的目录下。
  下面通过一个例子来说明:
  源文件:mylib.c#include  void welcome(void) {     printf("welcome to libmylib "); }
  1>编译mylib.c生成目标文件:
  $gcc -o mylib.o -c mylib.c
  2>将目标文件加入到静态库中:
  $ar -rcs libmylib.a mylib.o
  【注】库文件名以lib开头,以.a结尾。
  3>将静态库copy到Linux的库目录(/usr/lib或者/lib)下:(也可以不拷贝,注意配置环境变量)
  $sudo cp libmylib.a /usr/lib/libmylib.a //管理员身份
  编写调用库函数的测试程序test.c:#include  int main(void) {     printf("create and use library: ");     welcome();      return 0; }
  4>使用静态库编译:
  $gcc -o test test.c -lmylib
  这里注意,编译时无需带上前缀和后缀。
  5>运行可执行程序test:
  $./test
  在Linux下,可以使用ar命令来创建和修改静态库。
  这些在linux下man ar一下就可以得到参数,这里说明几个常用的
  d:从库中删除成员文件。
  r:在库中加入成员文件,若存在,则替换。
  c:创建一个库。
  s:无论ar命令是否修改了库内容,都强制重新生成库符号表。
  其他的命令用时再man。
  【注】gcc -static 文件.c [-o 文件]//全部使用静态库的方法3 Linux创建和使用动态库
  动态库的基本概念
  1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。
  2.动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。别名由一个前缀lib,然后是库的名字,再加上一个后缀".so"构成("libxxx.so")。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。
  3.在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。
  下面我们通过一个实例来学习如何生成动态库和使用动态库。3.1生成动态库
  1)当前文件夹下有下面四个文件
  $ ls -l
  文件内容分别为:
  $ cat mylib.h #ifndef _MYLIB_H_ #define _MYLIB_H_ #include  void print1(); void print2(); #endif
  $ cat dy1.c #include "mylib.h" void print1() {     printf("My first shared lib! "); }
  $ cat dy2.c #include "mylib.h" void print2() {     printf("My second shared lib! "); }
  $ cat main.c #include "mylib.h"  int main(int argc, char *argv[]) {     print1();     print2();     return 0; }
  2)这里我们将dy1.c与dy2.c用来创建动态库
  $ gcc -fPIC -Wall -c dy1.c dy2.c
  $ gcc -shared -o libtest.so dy1.o dy2.o
  这里 -fPIC 创建与地址无关的编译程序,-shared指定生成动态链接库。
  我们也可以一步到位
  $ gcc -o libtest.so -fPIC -shared dy1.c dy2.c
  我们可以看到下面已经生成了一个libtest.so
  $ ls -l
  3.2使用动态链接库
  在编译程序时,使用动态链接库和静态库是一致的,使用"-l库名"的方式,在生成可执行文件的时候会链接库文件。使用如下命令:
  $ gcc -o test main.c -L. -ltest
  $ ls -l
  这里 -L 指定动态链接库的路劲,-ldtest链接库函数test 。-ltest是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。
  我们可以看到这里已经生成了test可执行文件,我们可以执行一下:
  $ ./test
  可以发现发生了错误,这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。
  这就到了动态库的路径问题,有三种方法:
  1)把库拷贝到/usr/lib和/lib目录下:
  $ sudo cp libtest.so /lib
  【注】这里要超级用户权限sudo
  我们看一下执行结果:
  $ ./test
  这里执行结果正确。
  2)在 LD_LIBRARY_PATH 环境变量中加上库所在路径
  $ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
  我们可以看到:libtest.so 的路径已经存在
  $ ldd test
  我们可以看一下结果:
  $ ./test
  也能得到正确结果。
  3)添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新。
  $ cd /etc/ld.so.conf.d/
  $ ls
  $ sudo vi my.conf
  $ cat my.conf /home/bruceou/demo/libtest.so
  在/etc/ld.so.conf.d/下建立my.conf 里面只有一句/home/bruceou/demo/libtest.so即libtest.so的路径,然后执行ldconfig刷新即可。3.3动态库总结
  1.编译动态库
  方法一:
  命令:gcc -fPIC -Wall -c .c
  命令:gcc -shared -o lib.so .o
  方法二:
  命令:gcc .c .c .c -fPIC -shared -o lib.so
  2.安装路径
  命令:cp lib.so /usr/lib/lib.so//管理员身份
  3.动态库的链接
  命令:gcc -o  .c -L. -l
  或者:命令:gcc .c -L. -l -o
  4.运行可执行程序

专机避开海峡就安全吗,佩洛西想错了,歼16已经具备远程作战能力据航班跟踪信息软件显示7月30日,美军一架C40专机从安德鲁斯空军基地飞抵日本。而美国空军另外派出3架加油机随行,其中1架KC46A,2架KC135R,看来老佩真的来亚洲了,场面还00后网红远嫁西非后失联?周周在西非发视频报平安,家庭没有一夫多妻近日,一位20岁的中国女孩周周在西非在社交平台上表示自己要和非洲老公回他的家乡,引发全网关注。8月1日晚,周周在西非发视频报平安称现在很好,很抱歉让大家担心,老公家庭没有一夫多妻情周周在西非报平安疑在求助,视频时长110,声音哽咽像刚哭过00后中国女孩恋上80后非洲大叔,博主周周在西非借此吸引大量粉丝猎奇。7月30日,周周晒照片与男友同回非洲,当时的周周挺着大肚子,身边还坐着比她大15岁的非洲男友,祝福与劝阻声皆有捶大厂的人,正在被二舅的视频治愈冰川思想库研究员丨魏英杰有个概念叫作蝴蝶效应,很多人都知道。对于这个效应常见的阐述是一只在南美洲热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以导致两周后美国德克萨斯州的一场龙卷风。这个过4年开房400次?女教师补课期间出轨学生家长,暧昧视频疯传1hr常在河边走哪有不湿鞋最近,网上一条新闻引起广泛讨论。长春市某中学一名29岁的女教师,在给学生补课期间,出轨了学生家长。2016年,女教师王某开始给学生小美补课,每周准时到她家多地鼓励生育,降低生养教的成本,释放什么信号?鼓励生育,各地正在行动。8月1号第一财经报道,现在已经有30个省份完成人口与计划生育条例修订,有至少18省份发布了实施方案。比如,山东的新条例在今年11月份施行,除国家规定假期外,双碳先行四川宜宾绘就生态魅力画卷视频加载中央广网成都7月30日消息(记者苏莉实习生熊智龙邓杨)谈古,西南半壁古戎州,万里长江第一城,宜宾山川秀丽,景色宜人,无数文人墨客为此流连驻足。论今,宜宾市倡导生态优先,绿色92年台湾老兵回湖南探亲却找不到家,村民乡亲们都以为你不在了文明煜观史编辑明煜观史1992年,一位头发花白的老人,在离开家乡四十多年后,终于踏上了重返故土的旅程。70多岁的他从海峡那头的台湾,几经辗转,跨越了数千公里,来到了湖南省桃源县。时人口超广深加班比肩北京成都已成西部卷王?四川时髦度最高的除了川菜,还有靠慢生活怒刷国民好感度的魅力之都成都。成都是卷生卷死的互联网人吃火锅时挂在心头的躺平伊甸园,不知多少顶着黑眼圈的一线城市白领心中都怀揣着怒踹老板然后润美国战略模糊政策在佩洛西事件上的应用佩洛西声称其亚洲行程包括台湾,但美国众议院议长办公室官网公布的佩洛西亚洲行程中又没有列入台湾,究竟去与不去,飞机起飞甚至已经抵达新加坡后,都还未定。这是一种模糊策略。美国政府行政部石磊,山西农业大学副教授硕导,畜禽繁殖专家石磊,山西农业大学副教授硕导。畜禽繁殖专家。一研究方向1动物生殖生理2动物繁殖生物技术3动物繁殖营养调控石磊,山西农业大学副教授硕导,畜禽繁殖专家。二教授课程动物繁殖学生殖生物学生
阳过之后,咽喉肿痛声音嘶哑?送你四味中药,改善你的宝娟嗓这几天,身边的小阳人是越来越多了,好多人高烧退却后,最明显的症状就是咽喉肿痛声音嘶哑,有人戏称之为宝娟嗓,也有人称之为小刀剌嗓子。开门见山,今天就来和你聊聊咽喉肿痛的问题。中医认为曼城赢了,瓜迪奥拉怒了瓜迪奥拉不满曼城球员表现眼见榜首的阿森纳稳步前行,此前一直稳坐钓鱼台的曼城主帅瓜迪奥拉,似乎也开始着急了。今晨的英超第7轮补赛,曼城在上半场两球落后的局面下连下四城,逆转击败热刺,4559岁是黄金养寿期,记住2忌3宜4懒,向长寿靠近头条创作挑战赛45岁59岁是养生最为重要的阶段,这个年龄是世界卫生组织划定的中年范畴。这个年龄段,心态上走向成熟,但是身体却不停的在走下坡路,很多健康问题都会在这个年龄段对你伺机而资金北上彰显市场信心2023年新年的到来,似乎给资本市场带来开门红。数据显示,在2023年的第1个交易周内,A股市场三大股指全周涨幅均超过2。尤为值得注意的是,北向资金踊跃加仓A股市场,仅在1月13日新年将至,建议中老年人喝酒牢记3禁忌,平安快乐过新年人生得意须尽欢,莫使金樽空对月这句话意在说明要及时行乐,尤其是上了年纪的人,更应过好每一天,想吃就吃,想喝就喝。过年,在中老年人看来是十分重要的日子,因为春节家中所有人都齐聚,可以二次感染来袭,提醒中老年补蛋白是关键,多吃这4样,增强体质冬日生活打卡季疫情放开后,感染率达到一个高峰。面对史无前例的病毒变异,感染后的治疗和恢复都是我们需要解决的难题,我们也逐渐探索出方向。张文宏教授在近期的采访中提出奥密克戎会咬人的说今评弹被处罚和禁赛,活该!评论员李长需玩梗玩出火,很难收场。陕西西安的一场篮球线下活动,让一个男篮球员火了起来。当时双方球员在赛后互动,这位球员,因发表不当言论我睡的妞儿比你多,引来网友指责,事后他公开道歉张元英吃披萨,你觉得有食欲吗?今天一条热搜今日我的视野,张元英吃披萨的热搜。我点开热搜一看无非就是韩国人气女团成员张元英吃披萨的一个视频上了热搜。下图是她吃披萨的动图。但是呢评论区全是骂她的人,骂她油腻,作。其白痴皇帝淫邪悍妇八个不靠谱藩王一同敲响王朝的丧钟!西晋王朝的接力棒传到痴儿司马衷手里后,傻皇帝只需垂衣拱手,无为而治,便也能把这份工作混下去。因为司马炎留给他的是一个外戚朝臣宗室三方牵制势均力敌的局面,此时天下太平无事。然而一个女出尔反尔违背承诺战术小队即将推出付费DLC写实FPS游戏战术小队(Squad)开发商OffworldIndustries此前曾承诺,游戏永远不会推出付费DLC。但是在近日官方宣布下一次更新讲开始销售付费DLC时,游戏的长期2022年国游销量年榜暖雪位居榜单第一今日(1月20日),2022年国游销量年榜正式发布,该榜单是百度国游销量吧在制作组及多方大力配合下制作完成的。榜单只录入当年新发售的国产买断制游戏,往年发售的长卖游戏不登榜,数据统