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.cc3. 项目/CMakeLists.txt
以项目编译配置为主,注意这里配置了 gRPC 所需要的依赖 zlib 和 openssl ,不然会报错 NOT FOUND ZLIB::ZLIB 和 NOT 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.第三方依赖 GRPC
find_package (gRPC CONFIG REQUIRED)
find_package (Threads REQUIRED)
# 6.Link 依赖
target_link_libraries (
    demo PUBLIC
    store
    gRPC::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.运行
点击,若报错的话,还是依赖配置的问题

                










