【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 自身这个项目 ...
随机推荐
- Ubuntu访问samba共享文件
Ubuntu访问samba共享文件 参考:https://www.cnblogs.com/Wolf-Dreams/p/11241198.html 做法 安装samba-client.cifs-util ...
- markdown语法支持测试
latex 公式 \(v, w, \nu, \omega\) \[\iiint, \oiiint \] \(\Set{ x | x<\frac 1 2 }\) \(\displaystyle \ ...
- vba--将excel单元格格式改为常规格式
Sub 改格式() ActiveWorkbook.activesheet.Select For Each Rng In ActiveSheet.UsedRange With Rng .NumberFo ...
- ComfyUI进阶篇:ComfyUI核心节点(二)
ComfyUI核心节点(二) 前言: 学习ComfyUI是一场持久战.当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点.面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措. ...
- Redis缓存满了,如何存放数据?缓存淘汰策略
我们的redis使用的是内存空间来存储数据的,但是内存空间毕竟有限,随着我们存储数据的不断增长,当超过了我们的内存大小时,即在redis中设置的缓存大小(maxmeory 4GB),redis会怎么处 ...
- HTML手稿
没有一张图解决不了的事:https://www.processon.com/mindmap/5ccebc48e4b0841b844a23fb 1.网页中web 标准的三层组成? W3C 万维网联盟 结 ...
- C# 常用类和命名空间
Array类 用括号声明数组是C#中使用Array类的记号.在后台使用C#语法,会创建一个派生于抽象基类Array的新类.这样,就可以使用Array类为每个C#数组定义的方法和属性了. Array类实 ...
- ABC357
A link 循环加每一个数,加到哪个数不能加了输出前一个数,注意如果加到最后还能加,记得输出\(n\). 点击查看代码 #include<bits/stdc++.h> using nam ...
- SLF4J2.0.x与Logback1.3.x的绑定变动还是很大的,不要乱点鸳鸯谱
开心一刻 今天跟我姐聊天 我:我喜欢上了我们公司的一个女同事,她好漂亮,我心动了,怎么办 姐:喜欢一个女孩子不能只看她的外表 我:我知道,还要看她的内在嘛 姐:你想多了,还要看看自己的外表 背景介绍 ...
- 【perl】01
1.环境搭建 -- 解释器 / 编译器 Perl 在 Window 平台上有 ActiveStatePerl 和 Strawberry Perl 编译器. ActiveState Perl和 Stra ...