个人技术分享

项目场景:

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