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

使用cmake生成库主要要注意三个文件夹

(1)源文件文件夹
(2)中间文件夹(编译生成的.o等文件的文件夹)
(3)安装文件夹(最终可用的库所在的文件夹)

使用库的步骤
(1)在工程文件中包括库函数的头文件(可为绝对路径,也可配置全局环境变量用相对路径)
(2)在CMakeLists.txt或集成开发环境中指定库函数的动态链接库或者静态链接库所在的文件夹路径
(3)在CMakeLists.txt或集成开发环境中指定头文件的文件夹路径
(4)如果是动态链接库,且库函数不在linux默认查找路径下,运行时要修改环境变量才能使用

下文用最简单的示例来表示这个过程,假设我的库实现的是简单的加法计算。库函数的源文件名字叫hello.c,库函数的头文件名字叫hello.h,生成的动态链接库函数的名称叫libhello.so,目标是在/hello/install文件夹下安装这个库,以便后来调用。设库函数源文件在/home/hello/libhello目录,编译生成的中间文件夹在/home/hello/build

#1.生成库

文件夹结构如下

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

##1.1编辑文件

在libhello文件夹下编辑hello.c文件

#include<stdio.h>
#include"hello.h"

void hello()
{
      printf("hello");
}

和hello.h头文件。

#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void hello();
#endif

##1.2使用cmake编译和安装

(1)在/home/hello/文件夹下新建CMakeLists.txt,添加以下内容

cmake_minimum_required (VERSION 2.6)

add_library(hello SHARED ${PROJECT_SOURCE_DIR}/libhello/hello.c)
install(TARGETS hello LIBRARY DESTINATION lib)

其中
add_library(hello SHARED ${PROJECT_SOURCE_DIR}/libhello/hello.c)

PROJECT_SOURCE_DIR 宏的值是后文中cmake gui的where is source code 选项选择的路径值,也就是顶层CMakeList.txt所在文件路径的值。

才采用的是hello.c所在的绝对路径。

控制台输入cmake-gui

如图

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

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

##1.3将头文件安装到<prefix>/include/目录下

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

然后在cmake gui中点击configure配置,点击generate
然后在build文件夹make
make install

如图

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

#2.使用生成的动态链接库

##2.1 方法1.直接用gcc指定头文件路径和动态链接库路径

步骤如下

如图

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

###2.1.2编译主函数usehellolib.c 如下

#include <hello.h>
int main()
{
hello();
return 0;
}

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

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

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

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

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

再次运行 ./uselibhello
输出hello

(2)永久设置解决方案

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

然后在控制台执行

ldconfig

运行程序就能够执行了。

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

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

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

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

补充

猜你喜欢

转载自www.linuxidc.com/Linux/2019-01/156198.htm