项目场景:
Linux 动态链接库
调用 自定义 的动态链接库
动态链接库:
(1)编写.c和.h文件
(2)将.c文件转成.o文件
gcc -c *.c -fPIC
(3)将.o文件转成动态库文件 lib库名.so
gcc -shared -o lib库名.so *.o
(4) 使用动态库文件
gcc ex3.c -o res -I ./lib/ -L ./lib/ -l库名
静态链接库:
(1)编写.c和.h文件
(2)将.c文件转成.o文件
gcc -c xxx.c
(3)将.o文件转成静态库文件 lib库名.a
ar rcs lib库名.a *.o
(4) 使用静态库文件
gcc ex3.c -o res -I ./lib/ -L ./lib/ -lexmath -static
问题描述
gcc res文件时 找不到.so文件 使用 -L无法产生和静态库一样的效果;
-I(大写) /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include
-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib
-l (小写)world表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件),程序链接的库名是world。
原文链接:https://blog.csdn.net/sinat_31608641/article/details/122513674
//命令
$ gcc text.c -o res -I ./ -L ./ -lstrport
$ ./res
//结果
error while loading shared libraries: libstrport.so:\
cannot open shared object file: No such file or directory
原因分析:
系统找.so文件时默认路径是:/usr/lib/ 而我看似指向的是当前文件夹其实并没有产生效果
解决方案:
方法一:输入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
echo $CD_LIBRARY_PATH
方法二:输入
sudo cp -i libstrport.so /usr/lib/
为什么修改LD_LIBRARY_PATH呢
因为运行时动态库的搜索路径的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib和/usr/lib;
————————————————
LD_LIBRARY_PATH: 动态库的查找路径
设置:
方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效
方法二: 修改/.bashrc或/.bash_profile或系统级别的/etc/profile
原文链接:https://blog.csdn.net/yueyecheshou1980/article/details/106096013