链接是编译的最后一个步骤
静态链接
- 文件大
- 更新需要重新编译整个工程
动态链接
-
运行是才加载资源
-
体积小
-
依赖于动态库,版本问题比较严重
动态编译
gcc hello.c -o hello-share
默认使用动态链接
静态编译
gcc -static hello.c -o hello-static
制作静态库
库名: libxxx。a
-
先成一个目标代码
gcc -c add.c -o add.o gcc -c sub.c -o sub.o gcc -c mul.c -o mul.o gcc -c div.c -o div.o
-
打包生成静态库
ar -rsc libtest.a add.o sub.o mul.o div.o
-r 更新
-c 创建
-s 建立索引
-
测试静态库
gcc test.c -I./ -L./ -ltest -o test.out
-I inclide目录
-L 静态库的目录
-l 静态库的文件(不包含lit和结尾的.a)
静态库使用时需要 libxxx.a 和相应的头文件
动态库的制和使用
名称:libxxx.so
-
生成位置无关码
gcc -fpic -c div.c gcc -fpic -c add.c gcc -fpic -c sub.c gcc -fpic -c mul.c
-
生成共享库
gcc -shared add.o div.o sub.o mul.o -o libtest.so
-
编译测试
gcc test.c -L. -I. -ltest -o test.out
-
执行
./test.out error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
没有找到libtest.so
-
让程序可以找到 libtetst.so文件
cp ./libtetst.so /lib # 不推荐
复制到/lib目录之后,编译时就可以不用再指定 -L选项了
gcc test.c -I. -ltest -o aa.out ./aa.out
可以正常执行了
临时设置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径
把这个代码加到 ~/…bashrc中
vi ~/.bashrc # 最后一行加入 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径 source ~/.bashrc
修改ld配置文件
sudo vi /etc/ld.so.config # 在文件件最后添加动态链接库的绝对路径 sudo ldconfig # 使配置生效
使用符号链接
sudo ln -s 目标库绝对路径 /lib/libxx.so