CMAKE编译时如何自动下载第三方库并解压、安装到指定目录
- GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
导语
在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可以采用将库与源码分离的方式,在编译时根据情况来判断是否需要下载。
步骤
下面来解析下具体操作步骤,以下以 oracle oci 库下载为例。
UNSET命令初始化本次编译用到的参数变量
#初始化oci库压缩包路径参数LOCAL_OCI_LIB_ZIP
UNSET(LOCAL_OCI_LIB_ZIP CACHE)
#初始化oci库解压路径参数LOCAL_OCI_LIB_DIR
UNSET(LOCAL_OCI_LIB_DIR CACHE)
#初始化oci库压缩包下载路径参数LOCAL_OCI_LIB_ZIP_DL_DIR
UNSET(LOCAL_OCI_LIB_ZIP_DL_DIR CACHE)
SET命令设置参数初始路径或名称
#设置oci库存放文件夹名称
SET(OCI_LIB_NAME "oci_x86_lib")
# 设置oci库压缩包解压文件夹名称
SET(OCI_LIB_UNZIP_DIR_NAME ${OCI_LIB_NAME})
#设置oci库头文件存放文件夹名称
SET(LOCAL_OCI_INCLUDE_DIR_NAME "oci_include")
#设置oci库压缩包名称
SET(OCI_LIB_ZIP_NAME "oci_lib.tar.gz")
#设置oci库远程下载地址URL
SET(OCI_LIB_DOWNLOAD_URL "http://xxxxxx/oci_lib.tar.gz")
#设置oci库远程下载超时时间
SET(DOWNLOAD_OCI_LIB_TIMEOUT 600 CACHE STRING "Timeout in seconds when downloading oci_lib.")
FIND_FILE命令在路径下查找对应名称文件或文件夹是否存在,判断库是否已经下载或解压
#判断压缩包在文件夹ora_oci_lib下是否已经存在
FIND_FILE(LOCAL_OCI_LIB_ZIP
NAMES ${OCI_LIB_ZIP_NAME}
PATHS "ora_oci_lib"
NO_DEFAULT_PATH
)
#判断压缩包在文件夹ora_oci_lib下是否已经解压
FIND_FILE(LOCAL_OCI_LIB_DIR
NAMES ${OCI_LIB_NAME}
PATHS "ora_oci_lib"
NO_DEFAULT_PATH
)
#判断压缩包下载路径
FIND_FILE(LOCAL_OCI_LIB_ZIP_DL_DIR
NAMES ""
PATHS "ora_oci_lib"
NO_DEFAULT_PATH
)
MESSAGE命令输出相应步骤的提示信息
#输出当前正进行的操作步骤信息
MESSAGE(STATUS "Checking dblink ${OCI_LIB_UNZIP_DIR_NAME} + ${LOCAL_OCI_LIB_ZIP} .....")
判断当前压缩包是否存在,如果不存在则开始根据设定的URL地址进行下载
#判断压缩包是否已经存在
IF(NOT LOCAL_OCI_LIB_ZIP)
#不存在则进行下载操作,输出操作提示信息
MESSAGE(STATUS "Downloading ${OCI_LIB_ZIP_NAME} to ${LOCAL_OCI_LIB_ZIP_DL_DIR}")
#从设定URL地址下载相应的压缩包
FILE(DOWNLOAD ${OCI_LIB_DOWNLOAD_URL}
${LOCAL_OCI_LIB_ZIP_DL_DIR}/${OCI_LIB_ZIP_NAME}
TIMEOUT ${DOWNLOAD_OCI_LIB_TIMEOUT}
STATUS ERR
SHOW_PROGRESS
)
#判断下载是否存在错误
IF(ERR EQUAL 0)
#如果下载无错误则设置压缩包名称标记下载成功
SET(LOCAL_OCI_LIB_ZIP "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${OCI_LIB_ZIP_NAME}")
ELSE()
#下载错误输出相关的提示信息
MESSAGE(STATUS "Download failed, error: ${ERR}")
MESSAGE(FATAL_ERROR
"You can try downloading ${OCI_LIB_DOWNLOAD_URL} manually"
" using curl/wget or a similar tool"
)
ENDIF()
ENDIF()
根据设定标记判断是否下载成功,如果下载成功则对压缩包文件进行初步的校验,无问题则进行解压缩操作
IF(LOCAL_OCI_LIB_ZIP )
#输出相应的提示信息校验解压路径等
MESSAGE(STATUS "Checking dblink ${OCI_LIB_UNZIP_DIR_NAME} + ${LOCAL_OCI_INCLUDE_DIR_NAME} + ${LOCAL_OTL_INCLUDE_DIR_NAME} ")
IF(NOT EXISTS "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${OCI_LIB_UNZIP_DIR_NAME}" OR NOT EXISTS "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${LOCAL_OCI_INCLUDE_DIR_NAME}" OR NOT EXISTS "${LOCAL_OCI_LIB_ZIP_DL_DIR}/${LOCAL_OTL_INCLUDE_DIR_NAME}" )
#输出提示信息准备进行解压缩
MESSAGE(STATUS "cd ${LOCAL_OCI_LIB_ZIP_DL_DIR}; tar xfz ${LOCAL_OCI_LIB_ZIP}")
#获取已下载的压缩包大小做基本的判断
GET_FILE_SIZE(${LOCAL_OCI_LIB_ZIP} LOCAL_ZIP_SIZE)
#如果压缩包大小为0则输出对应的错误信息
IF(LOCAL_ZIP_SIZE EQUAL 0)
#移除损坏压缩包,重置相应的参数
FILE(REMOVE ${LOCAL_OCI_LIB_ZIP})
UNSET(LOCAL_OCI_LIB_ZIP)
UNSET(LOCAL_OCI_LIB_ZIP CACHE)
MESSAGE(FATAL_ERROR "${OCI_LIB_ZIP_NAME} is zero length. Deleting it.")
ELSE()
#下载文件基本无问题,进入解压路径开始解压压缩包
EXECUTE_PROCESS(
COMMAND ${CMAKE_COMMAND} -E tar xfz "${LOCAL_OCI_LIB_ZIP}"
WORKING_DIRECTORY "${LOCAL_OCI_LIB_ZIP_DL_DIR}"
RESULT_VARIABLE tar_result
)
#判断解压是否成功
IF (tar_result MATCHES 0)
#解压成功设置成功标记参数
SET(OCI_LIB_FOUND 1 CACHE INTERNAL "")
ELSE()
#解压失败输出相应错误提示信息
MESSAGE(STATUS "Failed to extract files.\n"
" Please try downloading and extracting yourself.\n"
" The url is: ${OCI_LIB_DOWNLOAD_URL}")
ENDIF()
ENDIF()
ENDIF()
ENDIF()
至此第三方库已经下载解压完成,后续可以根据自己源码,设置对应的链接路径进行编译
INCLUDE_DIRECTORIES 命令可以设置引用头文件包括路径
LINK_DIRECTORIES 命令可以设置引用第三方库文件所在路径
编译完成后可以使用INSTALL命令将后续应用运行时需要使用的库,拷贝到指定的安装目录
CMAKE_INSTALL_PREFIX 为设置的安装路径
OCI_LIB_NAME为库放置文件夹
# copy lib
INSTALL(
FILES ${allCopyFiles} DESTINATION ${CMAKE_INSTALL_PREFIX}/${OCI_LIB_NAME}
)
Enjoy GreatSQL
文章推荐:
面向金融级应用的GreatSQL正式开源
https://mp.weixin.qq.com/s/cI_wPKQJuXItVWpOx_yNTg
Changes in GreatSQL 8.0.25 (2021-8-18)
https://mp.weixin.qq.com/s/qcn0lmsMoLtaGO9hbpnhVg
MGR及GreatSQL资源汇总
https://mp.weixin.qq.com/s/qXMct_pOVN5FGoLsXSD0MA
GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA
在Linux下源码编译安装GreatSQL/MySQL
https://mp.weixin.qq.com/s/WZZOWKqSaGSy-mpD2GdNcA
关于 GreatSQL
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
Bilibili:
https://space.bilibili.com/1363850082/video
微信&QQ群:
可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群
QQ群:533341697
微信小助手:wanlidbc
本文由博客一文多发平台 OpenWrite 发布!
CMAKE编译时如何自动下载第三方库并解压、安装到指定目录的更多相关文章
- 【.Net Core】编译时禁止自动生成netcoreapp文件夹
原文:[.Net Core]编译时禁止自动生成netcoreapp文件夹 每次在编译生成文件时,VS都会自动在<OutputPath>属性指定的路劲后再追加一个用NetCore命名的文件夹 ...
- PyCharm里面执行代码没问题,Jenkins执行时找不到第三方库
在PyCharm里面代码执行没问题 本地cmd执行也没问题 Jenkins执行时报错 原因是第三方库是用PyCharm安装的,后来在Jenkins服务器上用pip装好第三方库后,就可以执行了 再执行 ...
- Linux(CentOS-7) 下载 解压 安装 redis 操作的一些基本命令
使用xshell 连接到虚拟机,并且创建 一个redis目录:创建文件命令:mkdir 文件名ls:查看当前文件里面的所有文件 使用xftp 将下载的linux版本 reids上传动新建的redis目 ...
- wget下载与tar压缩/解压
目录 wget命令 下载整个网站 压缩与解压 小节 wget命令 Usage: wget [OPTION]... [URL]... # 后台运行 -b, --background go to back ...
- VS编译时使用/去除NuGet管理库
原文链接:VS编译时自动下载NuGet管理的库 之前一直使用NuGet来管理一些第三方的库,但是每次check in代码时候为了保证编译通过,都需要把对应的packages check in. 比较耗 ...
- 用CMake设置Visual Studio工程中第三方库
较大的工程文件中一般会调用动态库或者静态库,如果这些库文件是当前工程包含的项目,CMake会自动识别并添加Debug和Release编译时需要的库文件路径和文件名,可以使用命令: Target_Lin ...
- 解决办法:CMake编译时出现“error in configuration process project files may be invalid”
无论是CMake2.84 还是当前最新的CMake2.87都可能会出现这种错: 查遍国内外的网上都没有给出可行办法,结果还是自己解决了 现把出错原因和解决办法如下:出错原因:因是英文版本,通常安装没有 ...
- AndroidStudio2.2.x以上使用cMake编译调用底层c生成依赖库
最近使用AndroidStudio的最新ndk编译方式cMake来编译底层cpp文件,由于之前没有接触过cMake语法,先附上官方学习文档地址:https://developer.android.co ...
- Python标准库与第三方库详解(转载)
转载地址: http://www.codeweblog.com/python%e6%a0%87%e5%87%86%e5%ba%93%e4%b8%8e%e7%ac%ac%e4%b8%89%e6%96%b ...
随机推荐
- AGC007E Shik and Travel 解题报告
AGC007E Shik and Travel 题目大意:\(n\) 个点的二叉树,每个点要么两个儿子,要么没有儿子,每条边有边权. 你从 \(1\) 号节点出发,走到一个叶子节点.然后每一天,你可以 ...
- React简单教程-4-事件和hook
前言 在上一章 React 简单教程-3-样式 中我们建立了一个子组件,并稍微美化了一下.在另一篇文章 React 简单教程-3.1-样式之使用 tailwindcss 章我们使用了 tailwind ...
- 【Java并发编程】Synchronized关键字实现原理
想必在面试中经常会被问到Synchronized关键字,它有什么特性,原理什么 它的主要特性是同步锁.非公平锁.阻塞锁.可以保证线程安全(可见性.原子性.有序性) JDK1.6之后对Synchroni ...
- 常用排序算法(一)-java实现
排序算法总结 1.十大经典算法及性能 2.具体排序算法 1.冒泡排序 循环过程中比较相邻两个数大小,通过交换正确排位,循环整个数组即可完成排序 图片演示 代码实现Java //冒泡排序 public ...
- 编程式导航路由跳转到当前路由(参数不变), 多次执行会抛出NavigationDuplicated的警告错误?
注意:编程式导航(push|replace)才会有这种情况的异常,声明式导航是没有这种问题,因为声明式导航内部已经解决这种问题. 这种异常,对于程序没有任何影响的. 为什么会出现这种现象: 由于vue ...
- Redis配置文件所在位置
更新记录 2022年6月13日 发布. Windows系统 Redis 配置文件位于 Redis 安装目录下文件名为 redis.conf 注意:Windows系统下名为 redis.windows. ...
- SQL Server各版本序列号/激活码/License/秘钥
SQL Server 2019 Enterprise:HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G Enterprise Core:2C9JR-K3RNG-QD4M4-JQ2HR-846 ...
- 软件成分分析(SCA)完全指南
上一篇文章中,我们讨论了 DAST 的概念.重要性及其工作原理.那在开发过程中如何查找开源软件包中的漏洞并学习如何修复?本指南带你一起了解 SCA 工具及其最佳实践. 如今,绝大多数代码驱动的应用程序 ...
- VR技术赋能五大领域,不止高级,更高效!
除了VR游戏.VR影视作品,究竟还有哪些产业领域会应用到VR技术并为生活带来改变呢?今天就帮大家好好梳理一下~ VR赋能交通,不只是高级 最近在网上看到了VR考驾照的新闻,网友都赞叹,现在学车都这么高 ...
- ShardingSphere-proxy-5.0.0分布式哈希取模分片实现(四)
一.说明 主要是对字符串的字段进行hash取模 二.修改配置文件config-sharding.yaml,并重启服务 # # Licensed to the Apache Software Found ...