【CMake】5. 单项目多模块添加第三方依赖示例工程

CMake 示例工程代码

https://github.com/LABELNET/cmake-simple

单项目单模块示例工程

https://github.com/LABELNET/cmake-simple/tree/main/simple-mod-deps

这里引入 C++ gRPC 依赖,进行示例

1. 多模块工程 + 第三方依赖

CMake 多模块工程,这是一个示例工程

  • simple-mod-deps , 项目名称
  • demo , 主模块 main ,引用 store 模块时,需配置依赖
  • store , 子模块 store

2. 目录结构

$ SIMPLE-MOD-DEPS      
│   CMakeLists.txt                 # 项目根 CMakeLists.txt,多模块
│   README.md                      # 说明文档,无关
├───.vscode                        # 头文件路径配置
│       c_cpp_properties.json
├───build                          # CMake 编译输出
├───cmake                          # 第三方依赖存放路径 FindXXX.cmake
├───demo                           # 主模块 main
│   │   CMakeLists.txt             # 主模块 CMakeLists.txt ,配置子模块链接
│   │
│   ├───include                    # 源码: 主模块头文件
│   │       demo_utils.h   
│   │  
│   └───src                        # 源码: 主模块源码实现
│           demo_utils.cc
│           main.cc                
│
└───store                          # 子模块│   CMakeLists.txt             # 子模块 CMakeLists.txt ,本地依赖包│├───include                    # 源码: 子模块头文件│       store_utils.h│└───src                        # 源码: 子模块源码实现store_utils.cc

3. 项目/CMakeLists.txt

以项目编译配置为主,注意这里配置了 gRPC 所需要的依赖 zlibopenssl ,不然会报错 NOT FOUND ZLIB::ZLIBNOT FOUND SSL 之类。
这里手动指定依赖包。

set (ZLIB_ROOT D:/Software/vcpkg/packages/zlib_x64-windows)
set (OPENSSL_ROOT_DIR D:/Software/vcpkg/packages/openssl_x64-windows)

windows 下两种方式可解决

  • github 下载源码,cmake 编译,然后按上述配置
  • vcpkg 下载编译好的版本,然后按上述配置
  • ucrt64 下载命令 pacman -S package下载(但不一定存在)

配置

cmake_minimum_required (VERSION 3.18)# 项目名称
set (PROJECT_NAME simple-mod-deps)
project (${PROJECT_NAME} VERSION 0.1.0)# 1.编译类型
if (NOT CMAKE_BUILD_TYPE)set (CMAKE_BUILD_TYPE Release)
endif ()# 2. C++ 标准库
set (CMAKE_CXX_STANDARD 14)
set (CMAKE_CXX_STANDARD_REQUIRED ON)# set(CMAKE_CXX_EXTENSIONS OFF)# 3. 第三方库
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake;${CMAKE_MODULE_PATH}")# 3.1 第三方库依赖环境, 可自行源码编译指定,也可使用 vcpkg 下载的包
set (ZLIB_ROOT D:/Software/vcpkg/packages/zlib_x64-windows)
set (OPENSSL_ROOT_DIR D:/Software/vcpkg/packages/openssl_x64-windows)# 4.工程名称
project (${PROJECT_NAME} LANGUAGES CXX)# 5.主模块 main
add_subdirectory (demo)# 6.子模块 store
add_subdirectory (store)# 7.项目打包
set (CPACK_PROJECT_NAME ${PROJECT_NAME})
set (CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include (CPack)# 8. Windows 异常
if (WIN32)add_definitions (-DNOMINMAX -D_USE_MATH_DEFINES)
endif ()# 9.使用编译缓存,提升编译速度
if (NOT MSVC)find_program (CCACHE_PROGRAM ccache)if (CCACHE_PROGRAM)message (STATUS "Found CCache: ${CCACHE_PROGRAM}")set_property (GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})set_property (GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_PROGRAM})endif ()
endif ()

4. 主模块/CMakeLists.txt

以功能实现为主,见示例代码 demo_server.cc 实现

cmake_minimum_required (VERSION 3.18)# 1.可执行文件
add_executable (demo)# 2.源码,注意: 源文件代码格式,这里用的为 .cc 文件
file (GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cc include/*.h)# 3.目标
target_sources (demo PUBLIC ${srcs})# 4.头文件
target_include_directories (demo PUBLIC include)# 5.第三方依赖 GRPCfind_package (gRPC CONFIG REQUIRED)
find_package (Threads REQUIRED)# 6.Link 依赖
target_link_libraries (demo PUBLICstoregRPC::grpc++gRPC::grpc++_reflection
)

5. 子模块/CMakeLists.txt

以功能实现为主

cmake_minimum_required(VERSION 3.18)# 1.源码,注意: 源文件代码格式,这里用的为 .cc 文件 , 若为 cpp 后缀自行添加
file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cc include/*.h)# 2.静态链接库
# add_library(store STATIC ${srcs})
# 2.1 动态链接库
# add_library(store SHARED ${srcs})
# 2.2 对象链接库
add_library(store OBJECT ${srcs})# 3.头文件
target_include_directories(store PUBLIC include)

6.运行

点击,若报错的话,还是依赖配置的问题
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323275.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安科瑞变电站综合自动化系统在青岛海洋科技园应用——安科瑞 顾烊宇

摘 要:变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计,利用先进的计算机技术、通信技术、信号处理技术,实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。 …

Spectron自动化测试总结

npm ERR! missing script: start [electron] UnhandledPromiseRejectionWarning: Error: ChromeDriver did not start within 5000ms npm install --save-dev spectron npm版本怎么降级 npm install npm4 -g 4代表是要降级的版本号 node mocha mochawesome报安装不成功 …

Spring Cloud Gateway 缓存区异常

目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常,在这里记录一下,直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…

AcWing 861. 二分图的最大匹配—匈牙利算法

题目链接:AcWing 861. 二分图的最大匹配 问题描述 分析 该题是一道典型的二分图匹配模板题,求解最大匹配数,可以用匈牙利算法来解决,下面举一个例子来说明匈牙利算法是如何运行的 以该图为例,其中 1可以匹配a,c 2可以匹配a,b 3…

springboot社区养老服务系统设计与实现

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1 研究背景 当…

5. 最长回文子串

引流:人工智能领域专栏 题目: 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 【解题思路】 不要多想,本题就用动态规划解决。既然是动态规划,…

AIGC初探:提示工程 Prompt Engineering

简介 提升工程是什么 提示工程(Prompt Engineering)是人工智能领域中的一个概念,特别是在自然语言处理(NLP)领域中。它是一种通过设计和优化输入提示来提高AI模型表现的方法。 对于基于转换器的大型语言模型&#x…

CPU平台做视频智能分析,Lnton视频分析平台不仅支持流分析,同时也支持图片分析了

LntonAIServer最新v1.0.09版本支持图片分析了,经过几个月的研发,在原有的视频流分析的基础上,我们终于支持大家都非常期待的图片分析功能了,图片分析的功能加上,能有利于很多场景的展开,比如在烟火、明厨亮…

看CHAT如何判断php Imagick writeImages写入gif已经完毕

CHAT回复:Imagick::writeImages() 是同步执行的,也就是说这个函数会阻塞直到 GIF 文件被完全写出。所以如果这个函数没有报错并成功返回,那么你可以认为 GIF 文件已经被完全写出了。 如果你想要在写出 GIF 文件后立即做一些操作(例…

Linux-故障排查

实验要求 samba仅允许192.168.1.0/24、192.168.10/24进行访问 开一台虚拟机 快照恢复到未联网安装 关闭防火墙 安全linux 编辑ens33网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33 将ens33网卡复制一份命名为ens37 cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc…

vue中key的用法

加key是提升vue渲染效率,减少DOM操作。 vue列表元素的更新机制: 当列表元素没有设置key的时候,vue判断是否操作这个DOM元素,是根据新旧两次数据的元素顺序进行对比,看一下元素内容是否发生变化。发生变化vue就操作这个…

如何将ElementUI组件库中的时间控件迁移到帆软报表中

需求:需要将ElementUI组件库中的时间控件迁移到帆软报表中,具体为普通报表的参数面板中,填报报表的组件中,决策报表的组件与参数面板中。 这三个场景中分别需要用到帆软报表二开平台的ParameterWidgetOptionProvider,FormWidgetOptionProvider,CellWidgetOptionProvider开…