CMakeList常用方法

本文记录了学习CMake的过程中的一些常用方法和预定义变量,如PROJECT_SOURCE_DIR和CMAKE_CURRENT_SOURCE_DIR,并介绍了如何使用CMake添加宏定义、设置头文件和链接库路径、构建库和可执行文件。此外,还提到了通过CMake执行shell脚本的技巧,旨在帮助理解CMake在项目构建中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言


学习几个月的mtcnn以及ssd等目标检测的源码,所以对caffe源码以及cmake基本用法都比较熟悉,而caffe源码的学习更加深了我对于卷积网络的理解,特别是理解mtcnn算法,而学习mtcnn算法则又加深了我对ssd源码的学习,真的感觉自己变强了,不过头发也没秃-_-。近来做项目有车牌识别准备通过mtcnn检测,然后用ssd对字符进行识别,感觉效果应该会比较好(虽然还未实现)。但由于对新知识的渴求,主要是需求在哪里(通过GAN网络生成图片进行训练,当然,次要原因想从源码理解对抗生成网络)。而pytorch的实现比较多,故最近需要学习pytorch,而然看了一天的pytorch以及AlexNet等常见卷积网路的实现,感觉对pytorch还是比较陌生,所以最近想先从源码编译入手,从源码来理解pytorch是如何实现对应的卷积池化等层,然后学习对抗生成网络(GAN)。当然,第一步首先是学习CMake然后找到对应的源码,所以在这里做一下笔记记录下来 -------------------- 2018.11.29






#CMake常用预定义变量


  • PROJECT_SOURCE_DIR 所运行的CMakeList.txt所在文件夹下的工程目录
  • CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的目录

在cmake还可以添加c++文件中的宏定义:

add_compile_definitions()
  • 比如我们如果在所需编译的c++代码中调用了#ifdef CUDA,我们可以在CMakeList.txt文件中使用add_compile_definitions(CUDA)来声明C++中的宏定义.

#常用的cmake语法


  • 命令行中输出消息:
#输出Hello World!字符串
me
<think>好的,用户之前问了关于CMake中如何自动排序生成obj文件的问题,现在又询问CMake中list的用法。我需要先回顾之前的对话,确保回答的一致性和连贯性。用户可能是在学习CMake的过程中,逐步深入了解各个命令的使用。 首先,用户现在的问题是关于CMake的list命令的用法。根据之前的回答,我在介绍自动排序时提到了使用list(SORT)来排序源文件列表,所以用户可能对list的其他功能感兴趣,或者想更全面地了解这个命令。 接下来,我需要整理CMake中list命令的常见用法。用户可能需要知道如何创建列表、添加或删除元素、排序、查找元素、遍历列表等操作。同时,用户可能关心这些操作在实际项目中的应用场景,比如管理源文件、包含目录、编译选项等。 需要确保回答的结构清晰,分点说明,每个用法都给出示例,这样用户更容易理解。同时要注意避免使用过于专业的术语,用简单的中文解释,确保易懂。 另外,用户可能在实际使用中遇到问题,比如列表操作中的大小写敏感问题、空列表的处理等,所以注意事项部分也需要涵盖这些常见陷阱。 还要考虑用户可能的需求:他们可能是在编写CMakeLists.txt时遇到了列表管理的问题,需要快速查阅相关命令的使用方法。因此,提供实际应用示例会非常有帮助,比如如何动态管理源文件列表,如何过滤不需要的文件等。 最后,总结部分需要强调合理使用列表操作可以提升项目的可维护性,同时提醒用户注意潜在的问题,比如作用域限制和性能问题。 需要确保回答准确无误,参考CMake官方文档,避免提供错误的信息。同时保持语言简洁明了,符合用户要求的格式,使用中文,正确使用Markdown和LaTeX排版。</think>在CMake中,`list`命令是管理字符串列表的核心工具,常用于操作源文件列表、目录路径、编译选项等。以下是最常用的用法及示例: --- ### 一、基础操作 #### 1. **创建列表** ```cmake set(MY_LIST "apple" "banana" "cherry") # 显式定义 file(GLOB SOURCES "src/*.cpp") # 通过文件搜索生成列表 ``` #### 2. **获取列表长度** ```cmake list(LENGTH MY_LIST len) message("列表长度: ${len}") # 输出: 列表长度: 3 ``` #### 3. **访问元素** ```cmake list(GET MY_LIST 0 first_item) # 索引从0开始 message("第一个元素: ${first_item}") # 输出: apple ``` --- ### 二、增删改查 #### 1. **追加元素** ```cmake list(APPEND MY_LIST "date") # 添加单个元素 list(APPEND MY_LIST "egg" "fig") # 添加多个元素 ``` #### 2. **插入/删除元素** ```cmake list(INSERT MY_LIST 1 "avocado") # 在索引1插入 list(REMOVE_AT MY_LIST 2) # 删除索引2的元素 list(REMOVE_ITEM MY_LIST "date") # 删除所有匹配项 ``` #### 3. **查找元素** ```cmake list(FIND MY_LIST "banana" index) if(index GREATER_EQUAL 0) message("找到banana,索引: ${index}") endif() ``` --- ### 三、高级操作 #### 1. **排序** ```cmake list(SORT MY_LIST) # 默认字母升序 list(SORT MY_LIST COMPARE NATURAL) # 自然排序(如: file10 > file2) ``` #### 2. **反转/去重** ```cmake list(REVERSE MY_LIST) # 反转列表顺序 list(REMOVE_DUPLICATES MY_LIST) # 删除重复项 ``` #### 3. **子列表操作** ```cmake list(SUBLIST MY_LIST 1 2 sublist) # 从索引1取2个元素 ``` --- ### 四、遍历列表 ```cmake foreach(item IN LISTS MY_LIST) message("当前元素: ${item}") endforeach() ``` --- ### 五、实际应用场景 #### 1. **动态管理源文件** ```cmake # 收集所有.cpp文件,排除测试文件 file(GLOB_RECURSE ALL_SRCS "src/*.cpp") list(FILTER ALL_SRCS EXCLUDE REGEX ".*_test.cpp") ``` #### 2. **路径处理** ```cmake # 合并多个目录路径 set(INCLUDE_DIRS "/usr/include" "/opt/local/include") list(TRANSFORM INCLUDE_DIRS PREPEND "-I") # 转换为"-I/usr/include -I/opt/local/include" ``` #### 3. **条件编译选项管理** ```cmake list(APPEND COMPILE_OPTIONS "-Wall" "-Wextra") if(USE_DEBUG) list(APPEND COMPILE_OPTIONS "-g") endif() ``` --- ### 六、注意事项 1. **作用域限制**:`list`命令默认操作当前作用域的变量,使用`PARENT_SCOPE`可影响父作用域 ```cmake list(APPEND MY_LIST "new_item" PARENT_SCOPE) ``` 2. **空列表处理**:空列表的`LENGTH`返回0,访问不存在的索引会报错 3. **性能问题**:频繁操作大型列表(如数千个文件)可能影响CMake解析速度 4. **大小写敏感**:`FIND`和`REMOVE_ITEM`操作默认区分大小写 --- ### 总结 通过`list`命令可以实现CMake中列表的精细化控制,典型应用包括: - 管理源代码文件集合 - 动态构建编译选项 - 路径和依赖项处理 - 条件逻辑中的动态配置 合理使用列表操作可显著提升CMake脚本的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值