在工程中,我们能够经常看到xxx.a或者xxx.so文件, 以这两种命名结尾的就是链接库文件, .a结尾的为静态库链接文件, .so结尾的则为动态链接库文件。两者各有差异, 差异后面会细说。
静态库:
创建: -c是生成可重定位的ELF格式文件,如下图所示:
然后就可以生成静态链接库了:
// rc (replace and create)
然后就生成了libdemo.a静态库文件了
可以使用ar tv llibxxx.a 查看归档中的目录表
ar d libdemo.a sub.o 从库中删除sub.o 文件
使用:
//-L 为指定库路径 -l指定库名
动态库:
创建:
//-fPIC选项是指定编译器应该生成位置独立的代码
//-Wall 是编译器警告选项
然后就是生成动态链接库文件:
//-shared 命令就是创建目标模块的共享库
有时候为了确认目标文件是否在编译时使用了-fPIC 选项, 可以用以下命令判断:
nm sub.o | grep _GLOBAL_OFFSET_TABAL_
或者 readelf -s sub.o | grep _GLOBAL_OFFSET_TABAL_
同理:也可以使用下面命令,如果产生了输出, 那么指定的共享库肯定有一个未指定-fPIC 选项。
objump --all-headers libdemo.so | grep TEXTERL
readelf -d libdemo.so | grep TEXTERL
使用: 大致与静态库使用一制, 但是需要指定库路径;
不然会报以下错误:
这种错误就是在提示你, 该程序在默认路径未找到该链接库。这时候可以使用以下方法:
编译时使用 LD_LIBRARY_PATH=. ./main 这时系统是能够找到该链接库的
设置临时环境变量;export PATH="$PATH": xxx
将库路径永久添加在~/.bashrc或者/etc/profile 脚本中