GCC使用库文件

使用 GCC 编译器编译文件的时候避免不了链接库,C语言中有很多的标准库,使用的时候只需要包含相应的头文件,不需要手动的链接就可以使用标准库中的内容。当然如果使用自己制作的库文件或者是第三方库的时候需要链接,比如使用第三方库 Math 中的一些函数,编译程序的时候需要添加“-lmath”选项。

库文件到底是什么

库文件可以分为动态库文件和静态库文件,动态库文件又称为共享库文件是软件文件类型。动态库和静态库是根据链接的时期划分的:静态库的使用是在程序链接阶段被复制到程序中,程序运行的时候就不需要静态库文件。动态库文件的使用时期是在程序运行的时候被链接的。使用动态库的优点是系统只需要载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此可以节省内存。在Windows中很多的应用程序都不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,放置在系统中,当我们执行某一个程序时,相应的动态链接库文件就会被使用。

动态库和静态库的异同

不同点:
1. 动态库是运行时系统调用库函数实现链接,代码较小巧,而静态库是在链接时复制到代码中,代码量较庞大,冗余度高。
2. 正因为静态库这种方式也决定了它在链接后不再依赖静态库存在,即使静态库被删除程序依然可以正常运行,可移植性强。而动态库因为是利用本机的库      函数,所以可能移植到其他电脑会出现运行 bug 等问题,可移植性差。
3. 它们俩的区别在于链接过程的差异,和代码被载入的时刻不同
4. 动态库必须放在指定的目录下完成链接,而静态库给出链接文件路径即可

相同点:
1. 库文件中都不可以出现主mian函数
2. 这些库都是提供函数接口,满足功能的,不暴露源代码
3. 目的增加代码复用,可共享性,减小冗余
 

为什么要使用库文件?

在一个程序中,我们经常使用的功能会被封装到函数或者是类中方便重复使用。对于不同的文件,有些功能可能会频繁使用,如果不封装成库文件,我们可能每次都要实现这样的功能。在 linux 中的一些 C 语言的标准库就是这样,使用的时候,只要包含相应的头文件,库文件就会自动链接(标准库)方便我们移植。

另一方面是为了封装代码,有些时候我们不想要让别人看到实现功能的代码,但是可以使用我们实现的功能,这样就可以制作成库文件,也就是代码不开源。
 

Linux查看依赖库的方法

  1. 查看依赖的库:objdump -x xxx.so | grep NEEDED
  2. 查看可执行程序依赖的库:objdump -x 可执行程序名 | grep NEEDED
  3. 查看缺少的库:ldd xxx.so