为了对大型项目实现更好的管理【模块化协作开发等等】,cmake 提供了很多指令,可以对项目的结构进行调整、管理,便于项目的合理规划。本文我们要学习的就是 项目结构的设置,以及 构建程序等 输出路径的设置

本专栏的实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

涉及命令/变量

source_group

对文件进行分组,vs实现方式就是创建filter

source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>])
source_group(TREE <root> [PREFIX <prefix>] [FILES <src>...])

name group名称

FILES 需要管理的文件,

REGULAR_EXPRESSION 支持正则表达式

TREE 在 目录下设置 管理

add_subdirectory

实现代码结构分层,有利于模块化开发

在顶层CMakeListst.txt 使用这个命令,对代码结构进行分层管理

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])

source_group 和 add_subdirectory 二者区别

source_group 的实现,通过添加Filter实现,在本地并未创建 新的文件夹 【仅在 windows vs 】

add_subdirectory 是 对本地 已经创建的 文件夹 进行管理,实现代码分层、模块化

路径变量

CMAKE_PREFIX_PATH #安装路径 可以预设也可以 -D 传递
CMAKE_SOURCE_DIR = PROJECT_SOURCE_DIR # 顶层CMakeLists.txt 所在路径
CMAKE_BINARY_DIR = PROJECT_BINARY_DIR #
CMAKE_LIBRARY_OUTPUT_DIRECTORY
CMAKE_RUNTIME_OUTPUT_DIRECTORY
CMAKE_ARCHIVE_OUTPUT_DIRECTORY # 以下三个 需要使用 include(GNUInstallDirs) 才能使用
CMAKE_INSTALL_LIBDIR
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_INCLUDEDIR # 头文件 CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_BINARY_DIR
CMAKE_CURRENT_LIST_DIR # 当前cmakelists.txt文件所在路径 EXECUTABLE_OUTPUT_PATH # 库和可执行的最终存放目录
LIBRARY_OUTPUT_PATH $ENV{} # 调用环境变量
set(ENV{变量名} 值) #设置环境变量 CMAKE_CURRENT_LIST_FILE # 输出调用这个变量的 CMakeLists.txt 的完整路径
CMAKE_CURRENT_LIST_LINE # 输出这个变量所在的行

打印输出结果

上面给打了有很多内置变量进行控制

常用 的是

CMAKE_LIBRARY_OUTPUT_DIRECTORY

CMAKE_RUNTIME_OUTPUT_DIRECTORY

CMAKE_ARCHIVE_OUTPUT_DIRECTORY

CMAKE_CURRENT_LIST_DIR

CMAKE_SOURCE_DIR

输出路径设置

.so 库输出路径

#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
# set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../lib")
# set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../../lib")

执行程序 dll/ 动态库pdb 输出路径

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")

静态库lib 动态库.lib地址文件【windows】 静态库 .a【linux】 静态库 pdb 调试文件

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")

add_subdirectory 实例demo

初始结构

|---log

|---|---log.h

|---|---log.cpp

|---utils

|---|---utils.h

|---|---utils.cpp

|---main.cpp

|---CMakeLists.txt

顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(program_structure)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")

add_subdirectory(log)

add_subdirectory(utils)

add_executable(${PROJECT_NAME} main.cpp)

# 指定包含目录
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/log ${CMAKE_CURRENT_LIST_DIR}/utils) target_link_libraries(${PROJECT_NAME} log utils)

log 目录下的 CMakeLists.txt

add_library(log STATIC log.cpp log.h)

utils 目录下的 CMakeLists.txt

add_library(log STATIC log.cpp log.h)

构建完成后结构如下

windows 下 生成的对象会区分 debug 版本 和 release 版本 在输出路径上会产生 多一级文件夹 Debug/Release

默认Debug

source_group 实例demo

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(cmake_vs_group)

file(WRITE main.cpp [=[
int main()
{
return 0;
} ]=]) file(WRITE a.cpp "")
file(WRITE b.cpp "")
file(WRITE a.h "")
file(WRITE b.h "") add_executable(vs_group main.cpp a.cpp b.cpp a.h b.h) source_group(src FILES a.cpp b.cpp)
source_group(include FILES b.h)
# 后面src 路径 会去掉 root 内容 显示剩下的路径
source_group(TREE . PREFIX include/inc FILES a.h )

构建后效果如下

【CMake系列】06-项目结构与输出路径管理的更多相关文章

  1. Vue.js系列之项目结构说明

    转:https://www.jb51.net/article/111658.htm 前言 在上一篇项目搭建文章中,我们已经下载安装了node环境以及vue-cli,并且已经成功构建了一个vue-cli ...

  2. React Native 系列(三) -- 项目结构介绍

    前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...

  3. web项目Log4j日志输出路径配置问题

    问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文件夹下进行区分查看每个实例日志,要求通过尽 ...

  4. Dijkstra算法依据项目改进版,输出路径

    package dijkstra; import java.util.ArrayList; public class Dijkstra { ; /*private static int[][] Gra ...

  5. vue系列之项目结构

    参考地址:链接 build webpack配置相关 config webpack配置相关 node_modules  npm install 安装的依赖代码库 src  存放项目源码 static 存 ...

  6. Cmake 脚本对项目输出路径和输出头文件的路径定义

    对Lib项目的统一输出路径以下时解决方案: set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_O ...

  7. 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)

    原文:如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀) 我们都知道可以通过在 Visual Studio 中设置输出路径(OutputPath)来更改项目输 ...

  8. 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

    前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...

  9. 4. CMake 系列 - 项目添加编译选项

    目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 example 模块 2.4 顶层 CMakeLists.txt 3. 配置&编译 1. 项目目录 ...

  10. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

随机推荐

  1. GIS数据获取:土地利用与土壤属性、DEM、水体水系数据

      本文对目前主要的土壤属性.地表覆盖.数字高程模型与水体水系矢量数据获取网站加以整理与介绍.   本文为"GIS数据获取整理"专栏中第三篇独立博客,因此本文全部标题均由" ...

  2. 实验11.ACL实验

    # 实验11.ACL实验 本实验用于测试ACL,类似于防火墙. 拓扑 要求阻塞PC1到PC2和server的全部协议,阻塞client1到server1的icmp协议 具体配置 首先利用ospf协议实 ...

  3. python重拾第十三天-那就做个堡垒机吧

    本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...

  4. 高通 LK阶段配置使用I2C-8

    以MSM8953为例. 原文(有删改):https://blog.csdn.net/qq_29890089/article/details/108294710 项目场景 因为项目需要,需要在高通MSM ...

  5. 『vulnhub系列』EVILBOX-ONE

    『vulnhub系列』EVILBOX-ONE 下载地址: https://www.vulnhub.com/entry/evilbox-one,736/ 信息搜集: 使用nmap探测内网存活主机,发现开 ...

  6. SpringBoot注解配置文件映射属性和实体类

    配置文件加载 方式一 Controller上面配置@PropertySource({"classpath:pay.properties"}) 添加属性@Value("wx ...

  7. redis出现错误提示MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for......

    某天,redis出现了这样一个错误提示: MISCONF Redis is configured to save RDB snapshots, but is currently not able to ...

  8. javaweb上传图片存到本地,并存储地址到数据库

    前端使用layui的图片上传,将文件base64编码,然后在后端使用转码类来操作base64编码,并保存图片到本地,继而获取文件地址,将文件地址保存到数据库中 1.使用layui的图片上传 infos ...

  9. 基于 Impala 的高性能数仓实践之物化视图服务

    本文将主要介绍 NDH Impala 的物化视图实现. 接上篇,前两篇分别讲了执行引擎和虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join ...

  10. var 和 let 在 jQuery中的区别

    下面通过代码案例来进一步解释 var 和 let 在 jQuery link 函数中的区别: (function ($) { $.fn.link = function () { // Example ...