首页 > 其他分享 >【CMake系列】06-项目结构与输出路径管理

【CMake系列】06-项目结构与输出路径管理

时间:2024-06-12 13:48:27浏览次数:27  
标签:CMAKE CMake 路径 LIST CURRENT OUTPUT DIRECTORY 06 DIR

为了对大型项目实现更好的管理【模块化协作开发等等】,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,CMake,路径,LIST,CURRENT,OUTPUT,DIRECTORY,06,DIR
From: https://www.cnblogs.com/caibucai/p/18243777

相关文章

  • 【CMake系列】05-静态库与动态库编译
    在各种项目类型中,可能我们的项目就是一个库项目,向其他人提供我们开发好的库(windows下的dll/lib;linux下的.a/.so);有时候在一个项目中,我们对部分功能打包成库,方便在不同地方进行调用静态库和动态库对项目实现了不同程度的解耦,静态库,往往会链接时加载,代码会......
  • 【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if
    本文给出了cmake中的一些常用的指令,可以快速了解,为后面的内容深入打点基础。本专栏的详细实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流注释#行注释#[[多行注释]]message(""#[[这里也可以注释]]"")message在学习时......
  • 【CMake系列】01-CMake是什么
    在很多开源项目中,经常可以看到CMakeLists.txt这一文件,依靠它才能完成项目的配置运行过程。那它是什么?接下来,在这个专栏中,我们将系统学习CMake这一个重要工具。本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流CMake是什么CMake......
  • 【CMake系列】11-CMake Pack
    cmakepack用于将我们的写好的项目打包,发送给使用方;打包后产生的内容有源代码包二进制包平台原生的二进制安装Debian->.debredhat->.rpmmacOS->.dmgwindows->NSIS本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、......
  • 【CMake系列】10-cmake测试集成googletest与第三方库自动化构建
    cmake测试,使用ctest可能不能满足我们的需求,需要我们使用更为强大的第三方测试框架,如googletest,完成项目中的测试工作本篇文章将第三方测试框架googletest,引入,同时也可以作为关于第三方包自动化构建的很好示例,值得学习本专栏的实践代码全部放在github上,欢迎star!!!如......
  • 【CMake系列】10-cmake测试 ctest
    cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习如何借助cmake完成测试本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392......
  • 【CMake系列】09-cmake install 一般文件 文件夹 代码文件
    上一节,我们学习了项目构建后、目标的安装,本节学习的内容是对于一般文件,文件夹以及源代码的安装本节的文件依然使用file(WRITExxx.xx)来创建,不依赖额外的文件本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流文件安装CMakeLi......
  • 计算机毕业设计项目推荐,32006 node 中国传统节日介绍网站(开题答辩+程序定制+全套文案
    基于node.js中国传统节日介绍网站 摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,中国传统节日介绍网站当然也不能排除在外。中国传统节日介绍网站是以实际运用为开发背景,运用软件工程原理和开发方法,采......
  • [20240607]PL/SQL中sql语句的注解.txt
    [20240607]PL/SQL中sql语句的注解.txt--//别人测试遇到的问题,重复测试说明问题.1.环境:SCOTT@test01p>@verBANNER                                                                           ......
  • [20240601]简单探究free list chunk size的分布.txt
    [20240601]简单探究freelistchunksize的分布.txt--//前几天探究探究freelist,无意中发现12c版本freelistchunksize的发生了变化.单独另外写一篇blog.--//我开始分析以为脚本执行有问题,仔细查看12c版本freelistchunksize分布发生了变化.--//我找了以前的11g下的转储,发......