一,库:一种可执行代码的二进制形式,可以被载入内存执行。其中库分为静态库、动态库
二,静态库和动态库的区别
1)Linux 下静态库:名字一般为 lib***.a利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2)Linux 下动态库:这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
三,静态库的使用
操作工具:gcc 和 ar 命令
1)设计库的源代码
part1.c:
part2.c
2)编译.c文件:
gcc -O -c part1.c part2.c
生成part1.o 和 part2.o文件
3)链接静态库
ar -rsv libpart.a part1.o part2.o
-r replace existing or insert new file(s) into the archive
-s replace existing or insert new file(s) into the archive
-v replace existing or insert new file(s) into the archive
4)调用库的源代码
main.c
5)编译库并链接库
gcc -o main main.c -L ./ -lpart //一定不要忘记了 -lpart
解释: -L 后面跟库的路径 -l*** 是静态库 lib***.a 中去掉lib 和.a 名字后的
./main //执行
输出:
This is the first lib src!
This is the second src lib!
四,动态库的使用
1)设计库代码 part.c
2)生成动态库
gcc -O -fpic -shared -o dl.so pr1.c
-fpic :-f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)
3)调用函数的写法
4)调用编译
gcc -o main ./dl.so
执行: ./main
输出:
六,动态库的显式调用
显式调用动态库需要四个函数的支持, 函数 dlopen 打开动态库, 函数 dlsym 获取动态库中对象基址, 函数 dlerror 获取显式动态库操作中的错误信息, 函数 doclose 关闭动态库.
调用代码:main.c
编译调用:gcc -o main main.c -L ./ -ldl
前提:此时还不能立即./main,因为在动态函数库使用时,会查找/usr/lib、/lib目录下的动态函数库,而此时我们生成的库不在里边。 这个时候有好几种方法可以让他成功运行: 最直接最简单的方法就是把dl.so拉到/usr/lib或/lib中去。 还有一种方法 export LD_LIBRARY_PATH=$(pwd) 另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 。另外还有个文件需要了解/etc/ld.so.cache,里面保存了常用的动态函数库,且会先把他们加载到内存中,因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。
我们采用:export LD_LIBRARY_PATH=$(pwd) 可以echo $LD_LIBRARY_PATH 查看一下
执行: ./main
输出:This is the first so src
p = 8
七,库依赖的查看
使用ldd命令来查看执行文件依赖于哪些库。
该命令用于判断某个可执行的 binary 档案含有什么动态函式库。
[root@test root]# ldd [-vdr] [filename]
参数说明:
--version 打印ldd的版本号
-v --verbose 打印所有信息,例如包括符号的版本信息
-d --data-relocs 执行符号重部署,并报告缺少的目标对象(只对ELF格式适用)
-r --function-relocs 对目标对象和函数执行重新部署,并报告缺少的目标对象和函数(只对ELF格式适用)
如果命令行中给定的库名字包含'/',这个程序的libc5版本将使用它作为库名字;否则它将在标准位置搜索库。运行一个当前目录下的共享库,加前缀"./"。
分享到:
相关推荐
### Linux静态库与动态库详解 #### 基本概念 **库的定义与作用**:库,实质上是预编译的代码集合,旨在提供重复使用的功能或服务,简化软件开发过程。无论是在Windows还是Linux平台,库的存在极大地提高了编程效率...
### Linux静态库及动态库创建及使用 #### 一、基本概念 ##### 1.1 什么是库 在计算机编程领域,**库**(Library)是一系列预编译的代码集合,这些代码通常实现了某些功能或服务,可供其他程序在运行时调用。库可以...
我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的...
### gcc生成静态库和动态库详解 #### 一、引言 在软件开发过程中,为了提高代码的复用性及维护性,常常需要将一些通用的功能封装成库文件供其他程序使用。根据链接方式的不同,库文件可以分为静态库和动态库。本文...
通过上述步骤,我们不仅了解了如何在Linux环境中创建和使用静态库与动态库,还学习了它们之间的主要区别: - **静态库**:在编译时会被链接到最终的可执行文件中,因此一旦程序被编译完成,就不需要依赖外部的库...
Linux 使用 GCC 生成静态库和动态库 在 Linux 系统中,使用 GCC 编译器可以生成静态库和动态库。静态库和动态库是两种不同的库类型,它们的主要区别在于代码被载入的时间不同。 静态库是在编译时被载入到可执行...
### 在Linux下生成动态库与静态库的知识点详解 #### 实验目的 1. **掌握使用GCC编译C语言程序的基本方法和技巧** - GCC是GNU Compiler Collection的一部分,广泛用于Linux环境中C、C++等语言的编译工作。 - 了解...
本篇将详细介绍如何在Linux环境下,特别是内核版本为5.4.0的系统中,使用这些库的动态库和静态库。 1. ffmpeg动态库与静态库: - 动态库(.so文件):在运行时链接到程序,节省磁盘空间,但需要确保运行环境有相应...
### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...
根据库的载入时刻不同,Linux 库可以分为静态库和共享库(动态库)两种。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,...
### Linux静态库与动态库详解 #### 一、引言 在Linux环境下开发软件时,经常需要使用到库文件来实现复杂的功能。这些库文件可以分为两大类:静态库(static libraries)和动态库(dynamic libraries)。本文将详细介绍...
无论是静态库还是动态库,调用它们的方法大同小异,主要通过`#include`头文件并使用`extern "C"`来声明库函数。例如,如果静态库`libstatic.a`和动态库`libdynamic.so`分别提供了`add()`函数,可以在`main.cpp`中...
本文主要探讨的是Linux下的静态库和动态库。 首先,我们要了解什么是库。库本质上是一组预编译的函数和数据结构,以二进制形式存在,可供操作系统加载执行。由于Windows和Linux的系统架构差异,它们之间的库文件是...
在Linux环境下,使用GCC(GNU Compiler Collection)生成静态库和动态库是开发过程中的常见操作。静态库和动态库在程序构建和运行时各有特点,理解它们的工作原理和创建方法对于软件开发至关重要。 首先,静态库在...
#### 静态库与动态库的基本概念 在Linux环境下,静态库和动态库是两种常见的链接库形式,它们分别在编译和运行阶段发挥着不同的作用。 **静态库**在程序编译过程中会被链接到目标代码中,也就是说,最终的可执行...
### 使用GCC建立并调用静态库与动态库 在软件开发过程中,经常需要将一些功能模块封装成库供多个程序共享使用。库可以是静态库或动态库两种形式。本篇将详细介绍如何利用GCC(GNU Compiler Collection)编译器创建...
创建和使用Linux静态库是软件开发过程中的重要环节。通过上述步骤,我们可以理解如何在Debian系统下利用GCC编译器创建静态库,并将其应用到我们的项目中。静态库的使用有助于简化程序结构,提高代码重用率,同时在...
### VS2015动态库编译及调用 1. **创建动态库项目**: - 打开Visual Studio 2015,通过“文件”->“新建”->“项目”选择“Visual C++”下的“空项目”。 2. **配置为动态库**: - 右键点击项目,选择“属性”,...
本资料主要探讨的是Linux中的静态库与动态库的链接装载过程,以及如何理解和使用它们。 静态库,通常以`.a`文件格式存在,它将所有依赖的代码直接嵌入到目标程序中。当编译程序时,链接器会将静态库中的函数和数据...