Linux之静态库共享库
Posted bo1990
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之静态库共享库相关的知识,希望对你有一定的参考价值。
一、静态库和共享库的区别
- 静态库在编译的时候被加载,而共享库在执行之后才被加载
- 加载静态库编译所生成的可执行文件比使用共享库的方式要大
- 静态库以.a为后缀,共享库以.so为后缀
二、静态库的制作
- gcc -c add.c sub.c(编写源文件,gcc -c命令生成对应的目标文件add.o和sub.o)
- ar crs -o libmath.a add.o sub.o(ar命令归档目标文件,生成静态库libmath.a)
- gcc mian.c -L. -lmath(链接静态库libmath.a,编译生成可执行文件a.out)
三、动态库的制作
- gcc -c add.c sub.c(编写源文件,gcc -c命令生成对应的目标文件add.o和sub.o)
- gcc -fPIC-shared -o libmath.so add.o sub.o(-fPIC方式生成共享库文件libmath.so)
- gcc main.c -L. -lmath(链接共享库libmath.so,编译生成可执行文件a.out)
注意:在gcc编译生成可执行文件的时候,默认链接系统的共享库,但如果添加了-static选项则链接了系统的静态库,可执行文件会大很多;
应用程序找共享库的方式有四种:
- 环境变量LD_LIBRARY_PATH指定的共享库搜索路径
- 配置文件/etc/ld.so.conf中指定的共享库搜索路径(include /etc/ld.so.conf.d/*.conf)
- 默认的共享库搜索路径/lib
- 默认的共享库搜索路径/usr/lib
四、gcc命令常用选项
- -c(只生成可重定位目标文件.o)
- -o filename(指定输出文件的名字为filename)
- -g(生成调试信息,供gdb使用)
- -static(对于支持动态链接的系统,使用静态链接而不是动态链接)
- -I path(头文件包含目录,即在path目录下寻找相关的include文件)
- -L path(库文件包含目录,即在path目录下寻找相关的库文件)
- -lxx(链接库libxx.a或者libxx.so,比如若链接libm.so库则写成-lm)
- -std=xx(指定编译的语言标准,比如-std=c99或-std=c11)
- -Wall(输出错误和警告)
- -Werror(将警告视为错误输出)
- -Wl,option(将参数option作为后续链接器ld的参数)
- -Wl,rpath=path(指定非默认的共享库搜索路径,运行该程序时会在-rpath指定的目录下寻找共享库.so文件)
头文件来源:-I路径--->环境变量(C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、OBJC_INCLUDE_PATH)--->内定目录(/usr/include、/usr/local/include等)
库文件来源:-L路径--->环境变量(LIBRARY_PATH)--->内定目录(/lib、/lib64、/usr/lib、/usr/lib64、/usr/local/lib、/usr/local/lib64)
五、未完待续~
以上是关于Linux之静态库共享库的主要内容,如果未能解决你的问题,请参考以下文章