GCC使用库文件
使用 GCC 编译器编译文件的时候避免不了链接库,C语言中有很多的标准库,使用的时候只需要包含相应的头文件,不需要手动的链接就可以使用标准库中的内容。当然如果使用自己制作的库文件或者是第三方库的时候需要链接,比如使用第三方库 Math 中的一些函数,编译程序的时候需要添加“-lmath”选项。
1. 动态库是运行时系统调用库函数实现链接,代码较小巧,而静态库是在链接时复制到代码中,代码量较庞大,冗余度高。
2. 正因为静态库这种方式也决定了它在链接后不再依赖静态库存在,即使静态库被删除程序依然可以正常运行,可移植性强。而动态库因为是利用本机的库 函数,所以可能移植到其他电脑会出现运行 bug 等问题,可移植性差。
3. 它们俩的区别在于链接过程的差异,和代码被载入的时刻不同
4. 动态库必须放在指定的目录下完成链接,而静态库给出链接文件路径即可
相同点:
1. 库文件中都不可以出现主mian函数
2. 这些库都是提供函数接口,满足功能的,不暴露源代码
3. 目的增加代码复用,可共享性,减小冗余
另一方面是为了封装代码,有些时候我们不想要让别人看到实现功能的代码,但是可以使用我们实现的功能,这样就可以制作成库文件,也就是代码不开源。
库文件到底是什么
库文件可以分为动态库文件和静态库文件,动态库文件又称为共享库文件是软件文件类型。动态库和静态库是根据链接的时期划分的:静态库的使用是在程序链接阶段被复制到程序中,程序运行的时候就不需要静态库文件。动态库文件的使用时期是在程序运行的时候被链接的。使用动态库的优点是系统只需要载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此可以节省内存。在Windows中很多的应用程序都不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,放置在系统中,当我们执行某一个程序时,相应的动态链接库文件就会被使用。动态库和静态库的异同
不同点:1. 动态库是运行时系统调用库函数实现链接,代码较小巧,而静态库是在链接时复制到代码中,代码量较庞大,冗余度高。
2. 正因为静态库这种方式也决定了它在链接后不再依赖静态库存在,即使静态库被删除程序依然可以正常运行,可移植性强。而动态库因为是利用本机的库 函数,所以可能移植到其他电脑会出现运行 bug 等问题,可移植性差。
3. 它们俩的区别在于链接过程的差异,和代码被载入的时刻不同
4. 动态库必须放在指定的目录下完成链接,而静态库给出链接文件路径即可
相同点:
1. 库文件中都不可以出现主mian函数
2. 这些库都是提供函数接口,满足功能的,不暴露源代码
3. 目的增加代码复用,可共享性,减小冗余
为什么要使用库文件?
在一个程序中,我们经常使用的功能会被封装到函数或者是类中方便重复使用。对于不同的文件,有些功能可能会频繁使用,如果不封装成库文件,我们可能每次都要实现这样的功能。在 linux 中的一些 C 语言的标准库就是这样,使用的时候,只要包含相应的头文件,库文件就会自动链接(标准库)方便我们移植。另一方面是为了封装代码,有些时候我们不想要让别人看到实现功能的代码,但是可以使用我们实现的功能,这样就可以制作成库文件,也就是代码不开源。
Linux查看依赖库的方法
- 查看依赖的库:objdump -x xxx.so | grep NEEDED
- 查看可执行程序依赖的库:objdump -x 可执行程序名 | grep NEEDED
- 查看缺少的库:ldd xxx.so
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算
优秀文章
- Go语言switch case语句
- Linux gzip命令:压缩文件或目录
- 什么是IDE(集成开发环境)?
- C# DataSet和DataTable:将查询结果保存到DataSet或DataTable中
- Linux文件系统不是必须的,而是必要的!
- 简化基于Maven的Scala项目创建详解
- JSP PageContext.getRequest()方法:获取当前的Request对象
- Spring getBeanDefinitionNames方法:获取JavaBean名称
- PHP new:实例化对象
- PHP imagecopyresampled()和imagecopyresized():图片压缩