linux中静态库与动态库
- 1. 静态库
- 静态库的制作:
- 静态库的使用:
- 2. 动态库
- 动态库的制作:
- 动态库的使用:
- linux中静态库与动态库的区别
1. 静态库
静态库的制作:
gcc add.c mult.c -c //这样就生成add.o mult.o目标文件
ar rcs libcalc.a *.o//生成libmain.a静态库
静态库的使用:
头文件在include文件夹下
库文件在lib文件夹下(libcalc.a是静态库)
源文件main.cpp在src文件夹下
要编译main.cpp:
gcc main.c -o app -I ../include/ -l calc -L ../lib/
#-I表示后面跟着头文件的路径
#-l表示后面跟着库的名字
#-L表示后面跟着(静态)库的路径
2. 动态库
动态库的制作:
1.gcc -c -fpic a.c b.c
2.gcc -shared a.o b.o -o libcalc.so
或者写成一句话:
gcc -shared -fpic a.c b.c -o libcalc.so
-shared 指定生成动态库
-fpic :fPIC选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
动态库的使用:
头文件在include文件夹下
库文件在lib文件夹下(libcalc.so是动态库)
源文件main.cpp在src文件夹下
---library
|
|___include
| |_________head.h
|___lib
| |_________libcalc.so
|___src
|_________main.c
在src文件中编译:
1.gcc main.c -o app -I ../include -l calc -L ../lib/
#-I表示后面跟着头文件的路径
#-l表示后面跟着库的名字
#-L表示后面跟着(动态)库的路径
(此时编译通过,执行app却报错)
报错的原因:
我们使用-I,-L,-l这三个选项都是“在编译期间”告诉编译器我们使用的头文件和库文件在哪里以及是谁,
但是,
当生成的可执行程序生成后就与编译器没有关系了,此后该可执行程序运行起来后,操作系统找不到该可执行程序所依赖的动态库,我们可以使用ldd命令进行查看。
#在运行时,系统会按照下面这个路径去寻找动态库,
#DT_RPATH段–>环境变量LD_LIBRARY_PATH–>/etc/ld.so.cache文件列表->/lib和/usr/lib
#所以,我们需要在上任意一个路径中去配置动态库的绝对路径
3. ldd app 查看可执行文件app所依赖的文件是否都找到了
2.大多是直接在环境变量中配置动态库的绝对路径
1) vim .bashrc
2) 在.bashrc的最后面添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:libcalc.so的绝对路径(可以通过pwd获得)
3) source .bashrc #更新
#此时./app就可以用了
linux中静态库与动态库的区别
在Linux中,库是一组可以被程序调用的可执行代码和数据文件。静态库与动态库是两种不同类型的库。
-
静态库
静态库也称为“存档文件”,它包含了编译器在编译时需要的对象文件的集合。这些对象文件会被打包在一个单独的文件中,被链接到程序中。当程序运行时,所有的代码和数据都被加载进内存,因此静态库也称为“静态链接库”。这意味着,每当程序运行时,都需要将库的完整副本加载到内存中,无论其中是否实际使用了所有函数或数据。因此,静态库通常比较大,但是具有很好的兼容性和稳定性。 -
动态库
动态库是一种在程序运行时才被加载的库,也称为“共享对象文件”。与静态库不同,动态库并不会被整个程序复制到内存中,而只会在需要时加载。因此,动态库通常比静态库小,但可能需要更多的运行时开销来查找、加载和卸载库。由于动态库的特性,它们可以被多个程序共享,这可以减少内存开销,并且使更新和维护库更加方便。
总体来说,静态库和动态库都有各自的优点和缺点,开发人员需要根据具体情况来选择使用哪种类型的库。通常,当需要与其他语言链接时,静态库是首选;而当需要共享库并且在多个程序之间共享代码时,动态库是首选。