设为首页 加入收藏

TOP

Linux下使用cmake生成动态链接库并使用(一)
2019-01-06 16:10:08 】 浏览:42
Tags: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所在的绝对路径。


(2)打开Cmake图形化工具并配置参数最后生成Makefile
注意(我的顶层CMakeLists.txt在/home/linuxidc/workspace/hello路径下)


控制台输入cmake-gui


如图


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


a)在where is source code选项选择/home/linuxidc/workspace/hello
b)在where to build the binaries选项选择/home/linuxidc/workspace/hello/build
c)在CMAKE_INSTALL_PREFIX选择可执行文件安装的路径/home/linuxidc/workspace/hello/install
d)选择编译类型CMAKE_BUILD_TYPE 设置为Debug,release
e )点击configure配置,弹出编译器类型选择界面,选择编译器类型
f )点击generate就能在where to build the binaries目录下看到Makefile文件了
在/home/linuxidc/workspace/hello/build文件夹下输入make在当前文件夹下生成libhello.so
输入make install


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


在/home/linuxidc/workspace/hello/install即CMAKE_INSTALL_PREFIX路径的看到文件
libhello.so
库的编译和安装已经实现了,为了方便使用,还需要将头文件安装到安装目录下。


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


在顶层文件夹下的CMakeLists.txt加入以下语句安装头文件到
/home/linuxidc/workspace/hello/install/include文件夹
INSTALL(FILES ${PROJECT_SOURCE_DIR}/libhello/hello.h
DESTINATION include)


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


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


如图


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


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


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


步骤如下


###2.1.1在目录/home/linuxidc/workspace/下新建工程usehellolib


如图


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


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


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


###2.1.3使用gcc命令链接并执行生成的可执行文件
在/home/linuxidc/workspace/usehellolib 目录下输入命令
linuxidc@linuxidc:~/workspace/usehellolib$ gcc usehellolib.c -I/home/linuxidc/workspace/hello/install/include -L/home/linuxidc/workspace/hello/install/lib -lhello -o usehellolib


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


语法分析:
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
输出hel
编程开发网

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++版遗传算法求解TSP 下一篇多目录工程的CmakeLists.txt编写..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }