当前位置: 首页 > news >正文

CMakelists.txt 实现多级目录编译

一、单项目模式

指的是我有多个cpp文件,但是man函数入口只有一个;这种项目就称为 单项目;

1、单目录编译–单项目模式

单目录编译比1简单,以下代码即可满足,这种适合只有一个main函数入口的项目;

# 单目录编译,只编译根目录下的文件
file (GLOB files  *.cpp) # 创建变量files
add_executable (lern  ${files} )

2、多目录编译–单项目模式

第一种方式:比较死板

以下这种方式比较死板,每添加一个文件都往 cMakeLists.txt 文件中加入cpp的路径,但却是最有效的方法;

add_executable (main  a.cpp b.cpp a/c.cpp ... )
第二种方式:灵活,但是支持2级目录

以下方案是编译2级目录的方法,如果超过2级目录,目前还没找到更好的方法,

# 多目录编译,编译根目录和子目录下的文件
file (GLOB_RECURSE files  *.cpp) # 创建变量files
add_executable (lern  ${files} )

二、多项目模式

指的是有多个cpp文件,每个文件都是一个单独的项目;也就是说,每个文件内都有一个main 函数;

1、多级目录-多项目模式

目录级别如下图,可以看到有三级目录,

2、传统方式-多项目模式

关键带看 *.cpp */*.cpp 所在行,这种方式只能编译当前目录以及子目录下的.cpp文件;

file (GLOB_RECURSE files  *.cpp */*.cpp) # 创建变量files
# 对 files进行遍历
foreach (file ${files})message(STATUS ${file})string(REGEX REPLACE ".+/(.+)/(.+)\\..*" "\\1-\\2" exe ${file})# 每个文件内都有一个main 函数入口,所以要调用多次 add_executable() 函数add_executable (${exe} ${file} )
endforeach () # foreach 结束

3、新模式-递归编译-多项目模式

代码如下,这种方式可以编译所有的级别目录下的cpp文件,不管你有多少级,都可以完整编译整个项目,很实用

# 定义函数,函数名为 makeAll
function(makeAll)# 遍历项目根目录和子目录下所有的 .cpp 文件makeDir(*)# 当前目录的cpp文件编译makeCpp(.)
endfunction()# 编译目录
function(makeDir dir)# 判断字符串是否包含 cmake-build-debug ,将结果输出到indexOfStr变量,若包含返回 > -1的值,若不包含返回-1STRING(FIND ${dir} cmake-build-debug indexOfStr)if(NOT indexOfStr MATCHES -1)# 和 cpp的 return; 一样用法return()endif()file (GLOB dirs ${dir}) # 创建变量filesforeach(item ${dirs})if(${item} EQUAL cmake-build-debug)# 和 cpp的 continue; 一样用法continue()endif()if(IS_DIRECTORY ${item}) # 判断是否目录,必须加上${} ,如果不加 ${} 就是字符串,无法判断是否目录makeDir(${item}/*) # 递归makeCpp(${item}) # 编译cppendif()#    message(STATUS ${item})endforeach()endfunction()# 编译单个目录下的所有cpp文件
function(makeCpp dir)file (GLOB cpp_files ${dir}/*.cpp) # 创建变量filesforeach(item ${cpp_files})message("make cpp file ->" ${item})string(REGEX REPLACE ".+/(.+)/(.+)\\..*" "\\1-\\2" exe ${item})add_executable (${exe} ${item} )endforeach()
endfunction()# 调用函数--编译所有的目录以及子目录
makeAll()

让我们看看编译后的打印的信息

http://www.lryc.cn/news/602599.html

相关文章:

  • 星辰大海的征途:星宸科技的中国芯片突围战
  • GaussianMesh运行指南
  • MySQL的常用数据类型详解
  • 飞算科技重磅出品:飞算 JavaAI 重构 Java 开发效率新标杆
  • 塔能科技物联运维平台及城市照明市场竞争力分析
  • kruscal重构树
  • 【Java EE】多线程-初阶-线程的状态
  • Ettus USRP X410/X440 运行 ADC 自校准
  • ubuntu qt环境下出现No suitable kits found解决方案
  • 2025最新Mybatis-plus教程(三)
  • 目前市面上有Android 16KB的手机吗
  • 【Bluedroid】bta_av_sink_media_callback(BTA_AV_SINK_MEDIA_CFG_EVT)流程源码分析
  • OSPF路由协议(上)
  • Linux驱动22 --- RV1126 环境搭建设备树修改
  • 【Linux篇】进程间通信:进程IPC
  • java每日精进 7.28【流程设计6.0(泳池和泳道)】
  • 重生之我在暑假学习微服务第三天《Docker-上篇》
  • 采用黑翅鸢优化算法BKA-CNN-LSTM、CNN-LSTM、LSTM、CNN四模型多变量回归预测,多输入单输出(Matlab)
  • 轻资产革命:连合直租如何用DaaS模式重塑企业资产逻辑
  • 【Apache Tomcat】
  • 设计模式实战:自定义SpringIOC(理论分析)
  • 中国汽车能源消耗量(2010-2024年)
  • 力扣17:电话号码的字母组合
  • 设计模式(二十四)行为型:访问者模式详解
  • ADB+Python控制(有线/无线) Scrcpy+按键映射(推荐)
  • 【学习笔记】AD7708/18(1)-理解官网的参考代码
  • MacBook IOS操作系统格式化U盘FAT32
  • 【深度解析】R语言与作物模型(以DSSAT模型为例)融合应用
  • 分布式微服务--核心组件与架构关系(一)
  • R语言简介(附电子书资料)