Linux库文件使用说明
在Linux上编写C或C++代码,我们经常会见到三种文件,即源文件.cpp,头文件.h,库文件.a和.so。其中源文件及头文件(-I
选项指定路径)比较好理解,我们来说说所谓的第三方库文件吧
为什么我们需要库文件?
- 在进行编程时,我们常常会使用到第三方库现成的功能(不重复造轮子,接口的实现由第三方提供),那么我们就会需要在编译的时候将第三方库链接进来(实现接口),从而能够让我们的程序得以正常运作。
- 标准c库由于使用频率比较高,所以自动链接,否则每次gcc编译时都要加
-lc
就很麻烦。而像数学库、c++标准库用gcc编译时就需要链接-lm
、-lstdc++
库文件的分类及其表示?
- 库文件主要分成两类:静态库和动态库
- 静态库是在程序链接过程中,直接将静态库中的所有代码嵌入到宿主代码中去,最终生成的EXE文件将比较大,在EXE的运行过程不需要静态库文件支持
- 动态库是对实现部分(.dll或.so文件)的导出部分的声明,编译链接后只是将导出声明部分编译到宿主程序,EXE文件执行时动态的引用与卸载(即运行时需要dll文件的支持)
- 库文件的表示:
- 静态库文件:
libxxx.a
,在链接的时候使用-lxxx
进行链接 - 动态库文件:
libxxx.so
,在链接的时候使用-lxxx
进行链接
- 静态库文件:
库文件是如何生成的?
- 静态库文件生成
- 动态库文件生成
- 本质上库文件是编译后的二进制代码,都是带有功能的源码文件编译后产生
如何来使用库文件?
- 库文件是编译后的二进制代码,使用
-llib
选项链接库时,会链接静态或动态库,优先链接动态库 - 用
-l
明确指定链接哪个库是因为第三方库如果函数有重名怎么办?,用这种方法可以避免这种迷惑 - 共享库链接方式
- 直接链接
gcc xxx.c ./libmylib.so
- 配置环境变量 LIBRARY_PATH,把库所在的路径配置进去
gcc xxx.c -lmyku
- 库路径不在默认路径下,通过
-L
添加库路径
gcc xxx.c -lmyku -L./
- 直接链接
用户环境下的LIBRARY_PATH与LD_LIBRARY_PATH同库文件是什么关系?
- 开发时,设置LIBRARY_PATH,以便gcc能找到编译所需要的共享链接库
- 发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库
如何查看可执行文件的链接库文件?
ldd myexe
查看该可执行程序的链接库文件