目录
1.将add.c和sub.c编译形成.o文件
gcc -c -fPIC add.c sub.c// fPIC生成位置无关码
2.讲add.o和sub.o打包成库
这里打包使用的不是ar命令,还是gcc命令
gcc -shared add.o sub.o -o libmymath.so
这样动态库就制作完了,还是需要对这个库进行一些包装,让库更规范一下。
3.Makefile
libmymath.so:add.o sub.o
gcc -shared -o $@ $^
%.o:%.c
gcc -c -fPIC $< //$<:把依赖文件一个一个拿过来执行,有几个依赖文件执行几次
.PHONY:clean
clean:
rm -rf add.o sub.o libmymath.so mylib mylib.tgz
.PHONY:output
output://发布一个库
mkdir -p mylib/include
mkdir -p mylib/lib
cp ./*.h ./mylib/include
cp ./*.so ./mylib/lib
tar czf mylib.tgz mylib
这是Makefile整理完的库
4.细节问题
我们将库打包好后,重新编译编译main
因为#include""的搜索规则是,在当前目录下寻找,找不到再去/usr/include中寻找头文件,但是我们的头文件在/mylib/inclue中,所以在编译的时候要指明我们的路径。
gcc -o main main.c -I ./mylib/include -L ./mylib/lib -lmymath
虽然编译好了但是运行main会报错
这个时候因为因为只在main编译的时候我们告诉编译器,这个库的位置,才得以编译通过。
但是我们并没有告诉操作系统,这个库的位置,所以在运行的时候,操作系统找不到这个共享库的位置。
使用ldd查看
的确是找不到mymath这个库。
5.解决办法
1.直接将自己的库拷贝到库中
把libmymath.so拷贝到/lib64目录下
把add.h sub.h拷贝到/usr/include目录下
这种方式只建议比较成熟的库我们可以这么做,自己写的就不要瞎搞了。
2.更改动态库辅助查找的环境变量
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:./mylib/lib
3. 在lib64中建立一个软连接
ln -s /home/wys/code/mylib/libsoft/mylib/lib/libmymath.so /lib64/libmymath.so