• 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编译时如何自动下载第三方库并解压、安装到指定目录的更多相关文章

  1. 【.Net Core】编译时禁止自动生成netcoreapp文件夹

    原文:[.Net Core]编译时禁止自动生成netcoreapp文件夹 每次在编译生成文件时,VS都会自动在<OutputPath>属性指定的路劲后再追加一个用NetCore命名的文件夹 ...

  2. PyCharm里面执行代码没问题,Jenkins执行时找不到第三方库

    在PyCharm里面代码执行没问题 本地cmd执行也没问题 Jenkins执行时报错 原因是第三方库是用PyCharm安装的,后来在Jenkins服务器上用pip装好第三方库后,就可以执行了 再执行 ...

  3. Linux(CentOS-7) 下载 解压 安装 redis 操作的一些基本命令

    使用xshell 连接到虚拟机,并且创建 一个redis目录:创建文件命令:mkdir 文件名ls:查看当前文件里面的所有文件 使用xftp 将下载的linux版本 reids上传动新建的redis目 ...

  4. wget下载与tar压缩/解压

    目录 wget命令 下载整个网站 压缩与解压 小节 wget命令 Usage: wget [OPTION]... [URL]... # 后台运行 -b, --background go to back ...

  5. VS编译时使用/去除NuGet管理库

    原文链接:VS编译时自动下载NuGet管理的库 之前一直使用NuGet来管理一些第三方的库,但是每次check in代码时候为了保证编译通过,都需要把对应的packages check in. 比较耗 ...

  6. 用CMake设置Visual Studio工程中第三方库

    较大的工程文件中一般会调用动态库或者静态库,如果这些库文件是当前工程包含的项目,CMake会自动识别并添加Debug和Release编译时需要的库文件路径和文件名,可以使用命令: Target_Lin ...

  7. 解决办法:CMake编译时出现“error in configuration process project files may be invalid”

    无论是CMake2.84 还是当前最新的CMake2.87都可能会出现这种错: 查遍国内外的网上都没有给出可行办法,结果还是自己解决了 现把出错原因和解决办法如下:出错原因:因是英文版本,通常安装没有 ...

  8. AndroidStudio2.2.x以上使用cMake编译调用底层c生成依赖库

    最近使用AndroidStudio的最新ndk编译方式cMake来编译底层cpp文件,由于之前没有接触过cMake语法,先附上官方学习文档地址:https://developer.android.co ...

  9. 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 ...

随机推荐

  1. 使用多线程提高REST服务器性能

    异步处理REST服务 1.使用Runnable异步处理Rest服务 释放主线程,启用副线程进行处理,副线程处理完成后直接返回请求 主要代码 import java.util.concurrent.Ca ...

  2. 记一次前端CryptoJS AES解密

    1.背景 业务需求,需要联动多个平台,涉及到各平台的模拟登录. 已知加密前明文且正常登录.(无验证码要求) 某平台验证验证方式为.\login接口POST一串json字符串 { "accou ...

  3. 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题

    刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...

  4. Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例

    前言 在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方 ...

  5. Caller 服务调用 - Dapr

    前言 上一篇我们讲了使用HttpClient的方式调用,那么如果我们现在需要更换为通过dapr实现服务调用,我们需要做哪些事情呢? Caller.Dapr 入门 如果我们的项目原本使用的是Caller ...

  6. .NET 6.0.6 和 .NET Core 3.1.26、Visual Studio 2022 17.2 和 17.3 Preview 2 和 .NET 7.0 Preview 5 同时发布

    Microsoft 昨天发布了适用于 .NET 6.0.6 和 .NET Core 3.1.26.NuGet.Visual Studio 2019 和 Visual Studio 2022 17.2 ...

  7. 实现领域驱动设计 - 使用ABP框架 - 解决方案概览

    .NET解决方案的分层 下图显示了使用ABP的 应用启动模板 创建的Visual Studio解决方案: 解决方案名称为问题跟踪,它由多个项目组成.通过考虑DDD原则以及开发和部署实践,该解决方案是分 ...

  8. Java 将HTML转为Word

    本文以Java代码为例介绍如何实现将HTML文件转为Word文档(.docx..doc).在实际开发场景中可参考此方法来转换.下面详细方法及步骤. 在编辑代码前,请先在程序中导入Spire.Doc.j ...

  9. java基础知识面试总结-部分

    前言 在平时的工作学习中,自己对微服务和springboot基础理论知识关注比较少,在面试中对于面试官的问题,很多基本都不能够达到精准,全面:现将自己面试中的问题做以总结: 1.谈谈你对微服务架构的认 ...

  10. Kafka KRaft模式探索

    1.概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.其核心组件包含Producer.Broker.Consumer,以及依赖的Zookeeper集群. ...