【CMake系列】06-项目结构与输出路径管理
为了对大型项目实现更好的管理【模块化协作开发等等】,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_DIRCMAKE_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-项目结构与输出路径管理的更多相关文章
- Vue.js系列之项目结构说明
转:https://www.jb51.net/article/111658.htm 前言 在上一篇项目搭建文章中,我们已经下载安装了node环境以及vue-cli,并且已经成功构建了一个vue-cli ...
- React Native 系列(三) -- 项目结构介绍
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
- web项目Log4j日志输出路径配置问题
问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文件夹下进行区分查看每个实例日志,要求通过尽 ...
- Dijkstra算法依据项目改进版,输出路径
package dijkstra; import java.util.ArrayList; public class Dijkstra { ; /*private static int[][] Gra ...
- vue系列之项目结构
参考地址:链接 build webpack配置相关 config webpack配置相关 node_modules npm install 安装的依赖代码库 src 存放项目源码 static 存 ...
- Cmake 脚本对项目输出路径和输出头文件的路径定义
对Lib项目的统一输出路径以下时解决方案: set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_O ...
- 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)
原文:如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀) 我们都知道可以通过在 Visual Studio 中设置输出路径(OutputPath)来更改项目输 ...
- 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定
前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...
- 4. CMake 系列 - 项目添加编译选项
目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 example 模块 2.4 顶层 CMakeLists.txt 3. 配置&编译 1. 项目目录 ...
- vue 快速入门 系列 —— Vue(自身) 项目结构
其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...
随机推荐
- 2019 南昌区域赛 CEGLM 题解 & lagrange 插值
B. A Funny Bipartite Graph 状压 dp ,利用了原题中选完左边点集,那么右边在 左边编号最大的那个数 之前的所有点都要选的性质,可以优化到 \(O(n \cdot 2^n)\ ...
- Freertos学习:02-FreeRTOSConfig.h
--- title: rtos-freertos-02-FreeRTOSConfig.h EntryName: rtos-freertos-02-FreeRTOSConfig date: 2020-0 ...
- 嵌入式入门必看!调试工具安装——基于 AM64x核心板
本章节内容是为评估板串口安装USB转串口驱动程序.驱动适用于CH340.CH341等USB转串口芯片. USB转串口驱动安装 适用安装环境:Windows 7 64bit.Windows 10 64b ...
- 尝试官方的第一个SpringNative 0.11程序(WSL2)
Spring Native是Spring推出微服务体系Spring Cloud之后的又一大举动,从名字可以猜出,Spring Native是一门面向云原生的技术.如果你还对这个概念不太理解,可以多看一 ...
- Modbus转Profinet网关模块连PLC与流量计通讯案例
一.案例背景 在饮品加工厂中,会涉及到流量计的使用,然而达到对流量计的精准控制和数据采集需要用到PLC,由于PLC和流量计可能使用不同的通信协议(如Profinet和Modbus),造成两者不能自接进 ...
- TIER 1: Crocodile
TIER 1: Crocodile nmap 在前几次练习中,我们已经熟悉 nmap 扫描,我们在本次靶机中使用继续使用 nmap 进行扫描. 扩充我们的知识库:-sC 选项启用了 Nmap 的默认脚 ...
- java面试一日一题:说下mysql中的binlog
问题:请讲下mysql中的binlog 分析:该问题主要考察对mysql中binlog的理解及使用场景? 回答要点: 主要从以下几点去考虑, 1.什么是binglog? 2.binlog的使用场景是什 ...
- 我用Awesome-Graphs看论文:解读Naiad
Naiad论文:<Naiad: A Timely Dataflow System> 前面通过文章<论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样>向大家 ...
- 特斯拉在感知网络架构引入BEV三维空间转化层
Learnging Where To Look End-to-End
- Jax计算框架的MPI通讯的扩展库 —— mpi4jax
地址: https://github.com/mpi4jax/mpi4jax PS. 关于这个library的性能表现并不是很清楚,没有亲自手动安装并测试过.这里只作为链接收藏之用,毕竟这个属于比较小 ...