linux怎么制作库文件,关于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

见下图

20180110223216134136.png

20180110223216155621.png

==========================================================================

制作动态库:

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 移动到家目录下(因为在那里才有权限))

见下图

20180110223216158551.png

20180110223216160504.png

======================================================================

X86下如何使用库文件(假设main.c中的代码用到了a.o和b.o中的函数)

gcc main.c -o main -L . -lxxx  (-L .  是指该静态库位于当前路径)

还有一个方法是: 将库文件copy到Linux库目录(不推荐这样做)

20180110223216163434.png

===============================================================================

gcc main.c -o main -L  .  -lyyy

20180110223216166364.png

运行之前需要做下面这个工作

20180110223216168317.png

如果不下心运行或库所在的路径改了...... 看下图

20180110223216174177.png

20180110223216182966.png

注意:

链接静态库的程序,里面已经包含了完整的库代码,可以在任何时候,直接运行

链接动态库的程序,不包含真正的库代码,只做了一些标记,运行的时候需要临时地找到动态库

有如下方法,让程序可以找到动态库:

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  是指链接库文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值