cmake系列-动态库的生成与链接

2023-11-09

运行系统:Ubuntu20.04

运行环境:python 2.7.17

系统不一样,遇到的问题可能不一样,该方法不一定见效

问题描述:工作中时常需要调用同事写的.so文件作为一些功能的接口,那么如何将cmake文件进行动态库生成和调用呢?实现方法或许有多种,此处记录自己成功使用的一种。

问题分析:动态库的生成比较简单,动态库的调用有时会遇麻烦(比如找不到库,找不到cpp中包含的头文件等)

1、.so文件的生成

首先创建一个完整的项目包,cpp文件中包含自身的.h文件

mkdir test_
cd /test_
mkdir include
cd /include
touch test.h
cd ../
touch test.cpp
touch CMakeLists.txt

 在CMakeLists.txt中写入必要的信息并加上生成动态库的指令:

add_library(test SHARED test.cpp)
target_link_libraries(test lib(该文件的依赖库))

该过程中注意将自己的头文件包含进来,不然编译报错找不到test.h

include_directories(${PROJECT_SOURCE_DIR}/include) #头文件的路径

 接下来在build目标下进行编译即可得到一个libtest.so文件

mkdir build
cd build
cmake ../
make

 动态库的生成就完成了。。。

若要提高代码的运行速度,编译前可将文件设置成发行版,即在CMakeLists.txt文件中加入如下指令!!!

set(CMAKE_BUILD_TYPE "Release")

2、.so文件的链接

以调用上述libtest.so动态库为例,首先将libtest.so及test.h文件拷贝至你当前的项目(或某一位置)

在你的cpp文件中调用该头文件

#include "test.h"

在CMakeLists.txt中添加必要的信息后,添加调用该库的指令:

include_directories(tesh.h所在的目录路径)  //路径不需要带/test.h
add_executable(A, A.cpp)
target_link_libraries(A, libtesh.so文件的路径)

一开始遇到的一些问题:

1、认为只要调用了libtest.so,不再需要拷贝test.h和在CMakeLists.txt中include_directories(),cpp中include "test.h"就能用了,因为生成libtest.so文件时已经包含了这个头文件,实际上编译会报错找不到该头文件。想一想:我们调用第三方库的时候,比如opencv,是不是需要在CMakeLists.txt中include_directories(¥{OpenCV_INCLUDE_DIRS}),安装opencv时本地是不是也下载了opencv库中的那些.h文件。所以调用别人的动态库也是一样,需要拷贝libtest.so文件和test.h头文件,在CMakeLists.txt中需要查找该.h文件。

2、自己的项目文件和调用的libtest.so库文件依赖的第三方库相同的情况下,认为libtest.so文件中包含的第三方库能作用于自己的项目,target_link_libraries()不再需要包含相同的第三方库,实际上是不能的,或许libtest.so文件中包含第三方库的作用域局限于test文件本身(猜的),target_link_libraries()在包含libtest.so文件的同时,需要再包含自身项目所需的第三方库。

3、调用libtest.so与调用其他第三方库的区别在于,第三方库是下载至本地,需要通过find_package()去查找,再通过include_directories()去包含头文件,再通过target_link_libraries()链接动态库。调用libtest.so只需要include_directories()和target_link_libraries(),记得拷贝.h文件和.so文件,如果是自己电脑生成的.so文件,只需写对文件路径即可。

###################理解不是很深,后面再做补充######################

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake系列-动态库的生成与链接 的相关文章

随机推荐

  • python中关于requests里的timeout()

    timeout 超时 首先是 为防止服务器不能及时响应 大部分发至外部服务器的请求都应该带着 timeout 参数 在默认情况下 除非显式指定了 timeout 值 requests 是不会自动进行超时处理的 如果没有 timeout 你的
  • Oracle identified by values

    有时候需要使用user的密码 却不知道user密码是什么 我常常使用如下把戏 1 记录密码hash值 2 更改为自己的密码 3 使用完后 利用identified by values 更改回原来的密码 在oracle 10g的时候 密码是h
  • opencv图像灰度重心算法

    原文 http blog csdn net moses1213 article details 44679603 导师交给的项目 其中一步就是求光斑的重心 网上有很多关于重心的代码 大体是利用cvFindContour函数找出图像的轮廓 然
  • 开源项目 xijia-plus 启动教程 (通用后管理系统)

    一 说明 xijia plus 是什么 xijia plus 是一个 通用后管理系统 脚手架 采用 springboot vue 进行开发 可以在该脚手架进行业务的快速开发 xijia plus 可以做什么 如果你想快速开发一个项目 可以用
  • Graphpad Prism9.5.1 安装教程 (含Win/Mac版)

    GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件 它可以将科学图形 综合曲线拟合 非线性回归 可理解的统计数据 数据组织结合在一起 除了最基本的数据统计分析外 还能自动生成统计图 安
  • 【程序员必须要掌握哪些算法】

    一个程序员一生中可能会邂逅各种各样的算法 但总有那么几种 是作为一个程序员一定会遇见且大概率需要掌握的算法 今天就来聊聊这些十分重要的 必抓 算法吧 你可以从以下几个方面进行创作 仅供参考 一 引言 算法作为程序员的核心技能之一 在软件开发
  • 安卓面试之轻松战胜内存优化问题

    熟悉如何内存优化 无疑是安卓工程师进阶的一个必要条件 同时也是面试的重点和难点 面试常见问题 1 如何优化内存 2 如何加载10M大小的图片 3 如何线上监控内存 为什么要优化内存 移动设备中 内存是非常重要的资源 如果内存使用不当 轻则出
  • 利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声

    利用短时傅里叶变换 STFT 对信号进行时频谱分析和去噪声 1 背景 傅里叶变换 TF 对频谱的描绘是 全局性 的 不能反映时间维度局部区域上的特征 人们虽然从傅立叶变换能清楚地看到一整段信号包含的每一个频率的分量值 但很难看出对应于频率域
  • 基于Spring Gateway路由判断器实现各种灰度发布场景

    文章目录 1 灰度发布实现 1 1 按随机用户的流量百分比实现灰度 1 2 按人群划分实现的灰度 1 2 1 通过Header信息实现灰度 1 2 2 通过Query信息实现灰度 1 2 3 通过RemoteAdd判断来源IP实现灰度 2
  • django中models field详解

    本文参考自 django官方文档models field 在model中添加字段的格式一般为 field name field type field options 一 field options 所有字段共用 1 null 默认为Fals
  • 滤波器拓扑结构:Sallen-key和Multiple Feedback

    在一些关于滤波器设计的地方 总可以看到Sallen key和Multiple Feedback这两个词组 但不清楚什么意思 查了查资料 顺带在此处记录一下 Sallen key 麻省理工学院林肯实验室的R P Sallen and E L
  • Android Studio第一次安装虚拟机时报错Emulator:ERROR: Unknown AVD name[ ], use -list-avds to see valid list.

    安装完虚拟机后点击启动报错 虚拟化已开启 解决办法 1 修改环境变量ANDROID SDK HOME路径指到platforms路径下 例如 D androidSDK platforms 2 重启Android Studio 3 重新安装虚拟
  • 学习笔记:CentOS7安装Docker

    一 检查CentOS 系统的内核版本 Docker 要求 CentOS 系统的内核版本高于 3 10 通过 uname r 命令查看当前的内核版本 二 检查并清除系统残余项 并安装Docker依赖环境 1 卸载Docker 可选 如果之前安
  • 百度新闻资讯类信息爬虫--统计一年内关键词新闻的条数

    背景 通过百度词条搜索 来查找300个关键词 在一年内发布新闻的条数 最终效果实现如下 实现思路 实现思路依然是 先根据多页的url 来找到规律 构建起一页的url def format url url params dict None g
  • [转]信息安全相关理论题(三)

    21 静态分析是运行程序后进行调试 A 对 B 错 您的答案 标准答案 B 22 安卓反编译后会出现 符号字节码表示是匿名内部类 A 对 B 错 您的答案 标准答案 A 23 反编译安卓应用后 一般应该先查看哪一个smali文件的代码 A
  • JAVA反射机制及应用场景

    往往当我们面对一项新的知识时 我们往往需要知道三个方面 它是什么 它能做什么 它比原有知识强在哪里 我们该怎么使用它 当你能够解决这些问题时 便意味着你已经对这项知识入门了 一 是什么 Java Reflaction in Action有这
  • TOGAF9.2第I部分 第2章核心概念

    本章提供的核心概念适用TOGAF标准 2 1 什么是TOGAF标准 TOGAF标准是一个架构框架 它提供了协助接受 生产 使用和维护企业架构的方法和工具 它基于支持最佳实践和可重用的现有架构资产集的迭代过程模型 2 2 TOGAF标准中的架
  • 学习笔记——机器学习(第二章)

    机器学习 第二章 还有很多细节部分 我正在完善和补充 Emmm 若有不足 还请包涵 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • 致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响

    背景 09年初 我们做了一个memcached的智能客户端库 业务只要将这个库链上 就能跟memcached服务器通信 并且实现了一致性哈希的分布式算法 后端memcached服务器可以无限制扩展 而且客户端能对memcached做自动故障
  • cmake系列-动态库的生成与链接

    运行系统 Ubuntu20 04 运行环境 python 2 7 17 系统不一样 遇到的问题可能不一样 该方法不一定见效 问题描述 工作中时常需要调用同事写的 so文件作为一些功能的接口 那么如何将cmake文件进行动态库生成和调用呢 实