> 文章列表 > linux中静态库与动态库

linux中静态库与动态库

linux中静态库与动态库

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文件夹下
linux中静态库与动态库
要编译main.cpp:

gcc main.c -o app   -I ../include/   -l calc   -L ../lib/
#-I表示后面跟着头文件的路径
#-l表示后面跟着库的名字
#-L表示后面跟着(静态)库的路径

linux中静态库与动态库


linux中静态库与动态库

linux中静态库与动态库


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中静态库与动态库的区别

在Linux中,库是一组可以被程序调用的可执行代码和数据文件。静态库与动态库是两种不同类型的库。

  1. 静态库
    静态库也称为“存档文件”,它包含了编译器在编译时需要的对象文件的集合。这些对象文件会被打包在一个单独的文件中,被链接到程序中。当程序运行时,所有的代码和数据都被加载进内存,因此静态库也称为“静态链接库”。这意味着,每当程序运行时,都需要将库的完整副本加载到内存中,无论其中是否实际使用了所有函数或数据。因此,静态库通常比较大,但是具有很好的兼容性和稳定性。

  2. 动态库
    动态库是一种在程序运行时才被加载的库,也称为“共享对象文件”。与静态库不同,动态库并不会被整个程序复制到内存中,而只会在需要时加载。因此,动态库通常比静态库小,但可能需要更多的运行时开销来查找、加载和卸载库。由于动态库的特性,它们可以被多个程序共享,这可以减少内存开销,并且使更新和维护库更加方便。

总体来说,静态库和动态库都有各自的优点和缺点,开发人员需要根据具体情况来选择使用哪种类型的库。通常,当需要与其他语言链接时,静态库是首选;而当需要共享库并且在多个程序之间共享代码时,动态库是首选。

莒南热线