本文属于牛客网上的一个项目笔记:Linux高性能服务器开发
目录
2、配置/etc/ld.so.conf 追加动态库路径 再更新 sudo ldconfig
3、把动态库文件直接放到 /lib/或/usr/lib 目录 (不推荐)
静态库在程序的链接阶段被复制到程序中;动态库在程序运行中系统动态加载到内存中。
静态库:
命名:
linux下的命名libxxx.a 注:xxx是库的名字 libxxx.a是库文件的名称
windows下的命名 libxxx.lib
制作:
1、gcc获得.o文件
2、将.o文件打包,使用ar工具(archive)
ar rcs libxxx.a xxx.o xxx.o
r 将文件插入备存文件中
c 建立备存文件
s 索引
使用
gcc main.c -o app -I headfilepath -l xxx -L libfilapath
gcc 源文件 -o 目标文件 -I 头文件路径 -l 静态库名称 -L 静态库路径
动态库:
命名:
linux下的命名libxxx.so 在linux下是一个可执行文件
windows下的命名 libxxx.dll
制作:
1、gcc得到.o文件,得到和位置无关的代码
gcc -c -fpic/-fPIC a.c b.c
2、gcc得到动态库
gcc -shared a.o b.o -o libxxx.so
使用:
gcc main.c -o app -I headfilepath -l xxx -L libfilapath
gcc 源文件 -o 目标文件 -I 头文件路径 -l 库名称 -L 库路径
静态库实验
做一个可以实现加减乘除的静态库
1、获得.o文件
2、生成静态库文件
3、在main中使用库
注:发布库的时候需要将头文件和库文件一起发布
动态库实验
做一个可以实现加减乘除的动态库
1、获得.o文件
2、生成动态库文件
3、在main中使用库
注意到,依赖动态库的my_app02提示缺少动态库,使用ldd 可以查看所依赖的动态库文件,
提示未找到,即没有加载到内存中
如何定位动态库文件呢?
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段—>环境变量LD_LIBRARY_PATH—>/etc/ld.so.cache文件列表—>/lib/或/usr/lib 目录找到库文件后将其载入内存。
解决办法:
1、环境变量
临时方法
用户方法:配置home目录下的 .bashrc 追加环境变量 再使之生效
系统方法:配置/etc/profile 同样 追加环境变量 再使之生效