静态库:在编译过程中将所有函数载入,体积大
静态库的产生:
- 由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
- ar命令将很多.o转换成.a,成为静态库,一般命名为libxxxx.a,其中xxxx是该lib的名称
编写静态库(举例):
- 需要头文件hello.h,源程序hello.c,主程序main.c,此处为了方便,都放在同一文件夹testit中
- 通过以下命令生成hello.o文件
- 创建静态库文件libmyfile.a
- 连接静态库文件生成目标程序
PS:
-static :表示程序的静态链接
-lmyfile:链接静态库myfile
-L. :链接时需指明静态库所存在的路径,‘.’表示当前路径
动态库:在可执行程序运行时才载入,体积小
动态库的生成:
- 动态库的后缀是.so,它由gcc加特定参数编译产生,命名一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号
编写动态库(举例):
- 头文件hello.h,源程序hello.c,主程序main.c与静态库相同
- 生成hello.o文件的操作与静态库一样
- 通过以下操作生成动态库libmyfile.so:
- 通过以下操作生成可执行文件hello:
- 但直接执行文件会出错,因为找不到libmyfile.so这个库,系统默认在系统的库文件夹里面搜索。懒得去改动系统文件
(其实是没找到),所以我们在每次运行程序的时候都执行一段语句指定动态库路径。下面给出运行错误和指定路径运行的情况:
可以看到,程序执行时找不到动态库
现在成功了,这里的LD-LIBRARY-PATH后面的".“是相对路径,可以用”…"表示上一级文件夹,诸如此类