关于Linux库文件的制作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Linux库文件的制作相关的知识,希望对你有一定的参考价值。
本文章记录Linux库文件的制作--静态库和动态库
===========================================================
静态库:
静态库特点----优缺点:
作个小比喻,我们需要看一本书,我们获得书的方法目前有两种,一、去书店买 二、去图书馆借
静态库就相当于去书店买.
优点: 编译完,运行的时候不再需要链接库(直接运行)
缺点: 1.编译完,二进制会变得很大...不运行时有点占用内存
2.不利于库函数版本的维护(新书出了,还需要去书店重新买!!)
=============================================================
动态库:
动态库特点----优缺点:
动态库相当于去书店借书
缺点: 对于赖的人来说.......
优点: 1.编译完,二进制变得不那么大,运行时自动链接库。
2.利于库函数版本的维护(新书出了,不需要重新去书店买。因为程序运行时在链接“图书馆”)
#####################################################################
注意:
以下静态库的名称是:xxx
以下动态库的名称是:yyy
操作过程:
制作静态库:
gcc a.c -o a.o -c (arm架构下运行的话要用交叉编译工具-- arm-none-linux-gnueabi-gcc)
gcc b.c -o b.o -c
ar rcs libxxx.a *.o
见下图
==========================================================================
制作动态库:
gcc a.c -o a.o -c
gcc b.c -o b.o -c
gcc -shared -fPIC -o libyyy.so *.o (建立完 .o .so 后需要将这些 .o .so 移动到家目录下(因为在那里才有权限))
见下图
======================================================================
X86下如何使用库文件(假设main.c中的代码用到了a.o和b.o中的函数)
gcc main.c -o main -L . -lxxx (-L . 是指该静态库位于当前路径)
还有一个方法是: 将库文件copy到Linux库目录(不推荐这样做)
===============================================================================
gcc main.c -o main -L . -lyyy
运行之前需要做下面这个工作
如果不下心运行或库所在的路径改了...... 看下图
注意:
链接静态库的程序,里面已经包含了完整的库代码,可以在任何时候,直接运行
链接动态库的程序,不包含真正的库代码,只做了一些标记,运行的时候需要临时地找到动态库
有如下方法,让程序可以找到动态库:
A) 通过设置LD_LIBRARY_PATH环境变量,例如: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib (推荐这么做)
B) 将自定义的动态库丢到系统的标准库路径下(比如/lib),不推荐这样做,你会污染系统目录结构
C) 直接修改系统标准库路径的默认值(即修改/etc/ld.so.conf.d/libc.conf),也不推荐这么做
D) 如果不想在运行的时候,使用以上办法来让系统找到你的动态库,还可以提前在编译的时候加上这么一个选项:
gcc main.c -o main -L somewhere/ -lxxx -Wl,-rpath=./somewhere/ (比较麻烦)
ARM编译链接动态库
===============================================================
arm-none-linux-gnueabi-gcc XXX.c -o XXX -I /home/ZZZ/YYY/include/ -L /home/huang/YYY/lib -lMMM
ZZZ 是指虚拟机用户名
XXX 是指.C文件名
YYY 是指家目录下安装了该动态库的里面有头文件和库文件的目录.
MMM 是指库名
-I 是指链接头文件
-L 是指链接库文件
以上是关于关于Linux库文件的制作的主要内容,如果未能解决你的问题,请参考以下文章