【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_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 )

构建后效果如下
在这里插入图片描述

posted @ 2024-06-12 13:34  蔡不菜和他的uU们  阅读(11)  评论(0编辑  收藏  举报