Linux下使用cmake生成动态链接库并使用(2)

语法分析:
gcc 源文件 -I头文件目录 -L动态链接库目录 动态链接库文件名(去掉lib在前面加l) -o 生成的可执行文件名字
发现可以链接成功
但是输入./usehellolib
会出现这个错误

linuxidc@linuxidc:~/workspace/usehellolib$  ./usehellolib
./usehellolib: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

Linux下生成动态链接库并使用(使用cmake)

说明找不到库,因为采用的是动态链接库,所谓动态链接是在运行时链接,编译链接的时候是直接告诉了GCC库的位置,因此会成功,而运行是如果不告诉操作系统库在哪个位置,当然找不到这个库,程序也就不能运行。因此要告诉操作系统库在哪个地方,linux使用LD_LIBRARY_PATH告诉系统库在哪个地方。(LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径)。

设置环境变量可以有临时,也可以永久设置。

(1)临时设置解决方案:
输入命令
linuxidc@linuxidc:~/workspace/usehellolib$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linuxidc/workspace/hello/install/lib

再次运行 ./uselibhello
输出hello

(2)永久设置解决方案

永久设置解决方案一:
su用户下
编辑.bashrc文件
vi /root/.bashrc
在最后加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linuxidc/workspace/hello/install/lib

然后
source /root/.bashrc
就能够运行了。

永久设置解决方案二:
本文使用的是Ubuntu 18.04.2系统
编辑该文件
vi /etc/ld.so.conf.d/libc.conf

在文件的末尾加入要调用的动态链接库的路径
本文加入
/home/linuxidc/workspace/hello/install/lib

然后在控制台执行

ldconfig

运行程序就能够执行了。

##2.2 方法2.Cmake链接动态链接库
那么在大型工程中怎么链接外部共享库呢?本节介绍编辑CMakeLists.txt来使用生成的动态链接库。
在工程目录/home/linuxidc/workspace/usehellolib下新建CMakeLists.txt如下:
PROJECT(usehellolib)
ADD_EXECUTABLE(usehellolib usehellolib.c)
INCLUDE_DIRECTORIES(/home/linuxidc/workspace/hello/install/include)
TARGET_LINK_LIBRARIES(usehellolib /home/linuxidc/workspace/hello/install/lib/libhello.so)

解析:
INCLUDE_DIRECTORIES()告诉编译器头文件在哪个位置。
TARGET_LINK_LIBRARIES()告诉链接器动态链接库在哪个位置
输入
cmake.
make
会出现链接错误
/usr/bin/ld: cannot find -lhello
/usr/bin/ld: cannot find -l*解决方法
ld链接器告诉你找不到库函数,那么你就要把库函数放到ld链接器能够找到的地方。因此解决方法如下

方法1
将要调用的库函数复制到linux默认搜索库函数的目录下
即/usr/lib 目录。
sudo cp /home/linuxidc/workspace/hello/install/lib/libhello.so /usr/lib

方法2
使用软链接(个人理解类似于创建快捷方式)
sudo ln -s /home/linuxidc/workspace/hello/install/lib/libhello.so /usr/lib/libhello.so

ln -s 它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件

方法3
类似于上文的动态链接库的路径设置方法
cd /etc/ld.so.conf.d/
cp libc.conf hello.conf
vi hello.conf

编辑hello.conf的内容如下
/home/linuxidc/workspace/hello/install/lib

告诉链接器动态链接库的路径。
执行
ldconfig
输入
ldconfig -p |grep libhello
输出libhello动态链接库信息
设置好后
注意要重新删除所有Cmake生成的文件
再输入
cmake.
make
就能够正常使用了。

补充

方法4
如果加上link_directories这一句就不会出现 cannot find -l* 的问题,最终的CMakeLists.txt如下
project(usehellolib)
cmake_minimum_required (VERSION 2.6)
INCLUDE_DIRECTORIES(/home/linuxidc/workspace/hello/install/include)
link_directories(/home/linuxidc/workspace/hello/install/lib)
add_executable(${PROJECT_NAME} usehellolib.c)
target_link_libraries(${PROJECT_NAME} hello.so)

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0f4d3468dc122fbfea45ba47c145e8bc.html