动态库

动态与静态函数库

当前的Linux大多是将函数库做成动态函数库

内存的访问速度是硬盘的好几倍,如果将常用的动态函数库加载到内存中(高速缓存
,cache),当软件套件要采用动态函数库时,就不需要重新从硬盘里读出,这样就>可以提高动态函数库的读取速度。这个时候需要ldconfig与 /etc/ld.so.conf的帮助
。将动态函数库加载到高速缓存(cache)中的过程如下:

1 将要写入高速缓存的动态方函数库所在的目录添加到: /etc/ld.so.conf
2 利用ldconfig执行文件将/etc/ls.so.conf读如高速缓存中
3 同时在/etc/ld.so.cache 文件中记录

添加mysql函数库
/usr/lib/mysql

函数库是由系统建立的且有一定功能的函数集合

但是库中对应的函数的源代码一般是不可见的,而对应的头文件中可以看到它的对外接口(函数原型)。

Linux中标准的C函数库放置在/usr/lib下,以文件形式存放。用户也可以根据自己的所需建立自己的用户函数库。函数库分为静态库(.a)和共享库(.so,ShareObj),共享库在windows环境也叫动态链接库(.dll)。

静态库是一些.o目标文件的集合,一般以.a形式结尾。。静态库在程序链接阶段使用,链接器将程序要用到的函数从库中提取出来,并整合到程序中,程序运行不再使用静态库了。

ar rcs lib库文件名.a 目标文件1 目标文件2.。。
r: 将.o文件加入静态库
c 创建静态库
s 产生索引

mkdir bin inlcude obj src lib
创建静态库
方法一:
gcc -o obj/*.o -c src/*.c
ar rcs lib/libfile.a obj/*.o

方法2:

ar rcs lib/libfile.a src/*.c

使用:

gcc -o 可执行文件 调用者的C源文件.c -Ldir -l库文件名

gcc -o obj/main.o -c src/main.c
gcc -o exe main.o -Ldir -lfile

-Ldir path
-lname 库目录文件


删除库文件不会影响可执行程序

gcc -o bin/mymathfun_test src/mymath_test.c -Iinclude -Llib -lmymathfun
共享库即动态链接库,在linux中以.so(share object)为后缀,在windows中以.dll为后缀。程序开始启动运行时,加载所需的函数,程序运行时也需要共享库的支持。共享库链接出来的文件比静态库要小得多。Linux中所有标准的共享库存放在/usr/lib目录中。

gcc -shared -fPCI -o lib库文件名.so 目标文件1,目标文件2,...,目标文件n

-fpci或-fPCI:表示创建产生独立目标代码,具体应用取决于平台;


运行可执行文件提示找汪以库文件的解决方案
sudo cp libmymathfun2.so /usr/lib
export LD_LIBRARY_PATH=库文件目录
删除静态库文件会影响到可执行文件的运行!(提示找不到库文件)


export LD_LIBRARY_PATH=lib

echo $LD_LIBRARY_PATH
// -Iinclude 不要忘了
gcc -o bin/mymathfun_test src/mymath_test.c src/mymathfun.c -Iinclude
查看现实行号

cat -n mymath_test.c

原文地址:https://www.cnblogs.com/countryboy666/p/11058448.html