一. 什么是库
库是一个二进制文件,包含的代码可被程序调用。例如标准C库、数学库、线程库等等。库有源码,可下载后编译,也可以直接安装二进制包。 库是事先编译好的,可以复用的代码,在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。Windows和Linux下库文件的格式不兼容。Linux下包含静态库和共享库。
二. 静态库
静态库有如下特点
编译(链接)时把静态库中相关代码复制到可执行文件中
程序中包含代码,运行时不再需要静态库
程序运行时无需加载库,运行速度更快
占用更多磁盘和空间
静态库升级后,程序需要重新编译链接
静态库的创建与链接参考如下步骤: 第一步:确定库中函数的功能、接口
第二步:编写库源码
/****hello.c****/ #include#include"hello.h" voidhello(void){ printf("helloAndyxi "); }
/****hello.h****/ #ifndef_HELLO_H_ #define_HELLO_H_ voidhello(void); #endif
第三步:编译生成目标文件
linux@linux:~/andy/lib$ls hello.chello.h linux@linux:~/andy/lib$gcc-chello.c-Wall linux@linux:~/andy/lib$ls hello.chello.hhello.o
第四步:创建静态库
linux@linux:~/andy/lib$ls hello.chello.hhello.o linux@linux:~/andy/lib$arcrslibhello.ahello.o//使用arcrs命令创建静态库 linux@linux:~/andy/lib$ls hello.chello.hhello.olibhello.a //注意libhello.a是库文件名,hello是库名 linux@linux:~/andy/lib$nmlibhello.a //使用nm命令可查看库中符号信息 hello.o: 00000000Thello Uputs
第五步:编写应用程序
/****test.c****/ #include#include"hello.h" intmain(intargc,constchar*argv[]){ hello(); return0; }
第六步:编译应用程序并链接静态库
linux@linux:~/andy/lib$ls hello.chello.hhello.olibhello.atest.c linux@linux:~/andy/lib$gcc-otesttest.c-L.-l hello //使用-L.-l+库名链接静态库 linux@linux:~/andy/lib$ls hello.chello.hhello.olibhello.atesttest.c linux@linux:~/andy/lib$./test helloAndyxi
由于使用的是静态库,编译后相关代码已经复制到可执行文件中。删除静态库,不影响程序执行
linux@linux:~/andy/lib$ls hello.chello.hhello.olibhello.atesttest.c linux@linux:~/andy/lib$rmlibhello.a linux@linux:~/andy/lib$ls hello.chello.hhello.otesttest.c linux@linux:~/andy/lib$./test helloAndyxi
三. 共享库
共享库有如下特点:
编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
程序不包含库中代码,尺寸小
多个程序可共享一个库
程序运行时需要加载库
库升级方便,无需重新编译程序
使用更加广泛
共享库的创建与链接参考如下步骤: 第一步:确定库中函数的功能、接口
第二步:编写库源码
/****hello.c****/ #includevoidhello(void){ printf("helloworld "); return; }
/****bye.c****/ #includevoidbye(void){ printf("bye! "); return; }
/****共享库头文件common.h****/ #ifndef__COMMON_H__ #define__COMMON_H__ voidhello(void); voidbye(void); #endif
第三步:编译生成目标文件
linux@linux:~/andy/lib/share$ls bye.ccommon.hhello.c linux@linux:~/andy/lib/share$gcc-c-fPIC*.c-Wall linux@linux:~/andy/lib/share$ls bye.cbye.ocommon.hhello.chello.o
fPIC选项:告诉编译器生成位置无关代码
位置无关代码:生成的".o文件"文件中的代码可以被加载到任意的地址执行。编译时用到了相对寻址而不是绝对寻址
第四步:创建共享库common
linux@linux:~/andy/lib/share$gcc-shared-olibcommon.so.1hello.obye.o linux@linux:~/andy/lib/share$ls bye.cbye.ocommon.hhello.chello.olibcommon.so.1
shared选项:告诉编译器生成一个共享库
生成的共享库的文件名叫"libcommon.so.1",其中".so"表示这是一个共享库,".1"表示这个库的版本是1
符号链接文件命名规则:lib<库名>.so
第五步:编写应用程序
/****test.c****/ #include#include"common.h" intmain(intargc,constchar*argv[]){ hello(); bye(); return0; }
第六步:编译应用程序并链接共享库
#****为共享库文件创建链接文件****# linux@linux:~/andy/lib/share$ls bye.cbye.ocommon.hhello.chello.olibcommon.so.1test.c linux@linux:~/andy/lib/share$ln-slibcommon.so.1libcommon.so //ln-s创建符号链接 linux@linux:~/andy/lib/share$ls bye.cbye.ocommon.hhello.chello.olibcommon.solibcommon.so.1test.c
#****编译应用程序并链接共享库****# linux@linux:~/andy/lib/share$gcc-otesttest.c-L.-lcommon linux@linux-:~/andy/lib/share$ls bye.cbye.ocommon.hhello.chello.olibcommon.solibcommon.so.1testtest.c
gcc -o test test.c -L. -lcommon:可见此处共享库和静态库用法相同;GCC在链接时首先找共享库,如果共享库不存在,则链接静态库,如果静态库也找不到,则报错
加"-static"选项后,编译器会直接去找静态库
共享库的加载:如果完成上述步骤后就执行程序,会报如下错误
linux@linux:~/andy/lib/share$./test ./test:errorwhileloadingsharedlibraries:libcommon.so:cannotopensharedobjectfile:Nosuchfileordirectory
出错原因:因为程序链接的是共享库,并没有复制共享库中的代码,程序在执行时会去加载用到的共享库,加载时会去缺省路径(比如"/lib","/usr/lib")下寻找共享库,但是我们创建的库在当前目录下,并不在系统库的搜索路径里,所以在执行时找不到共享库,因此报错
创建好共享库后还需要添加共享库加载路径
第七步:加载共享库并执行程序
linux@linux:~/andy/lib/share$exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:. linux@linux:~/andy/lib/share$./test helloworld bye!
export 用于将原来的环境变量导出
":"前面的"$LD_LIBRARY_PATH"是引用原先的值;":"后面的"."是追加了当前目录;还可追加其余共享库的路径,要用":"隔开
此方法是临时的,只对当前终端有效。当重新打开一个终端再执行改程序时又会报错
为了让系统能找到要加载的共享库,通常由三种方法:
把库拷贝到/usr/lib和/lib目录下
在LD_LIBRARY_PATH环境变量中添加库所在路径
添加/etc/ld.so.conf.d/*.conf文件,执行 ldconfig刷新
审核编辑:汤梓红
-
Linux
+关注
关注
87文章
11279浏览量
209264 -
函数
+关注
关注
3文章
4326浏览量
62553 -
静态库
+关注
关注
0文章
21浏览量
7426 -
编译
+关注
关注
0文章
656浏览量
32847 -
共享库
+关注
关注
0文章
4浏览量
5613
原文标题:Linux 中的静态库和共享库
文章出处:【微信号:嵌入式攻城狮,微信公众号:嵌入式攻城狮】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论