[CMake笔记] CMake向解决方案添加源文件兼头文件
回顾
在上一篇笔记里总结的时候说到,aux_source_directory这个函数在添加源码文件时,是不会把头文件添加进去的,这里就介经一下另外一个方法,也是我一直使用的。
添加文件*.cpp与*.h
文件夹结构
CMakeFile
|--CMakeLists.txt
|--main.cpp
|--stdafx.h
CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0) # 项目名称
project(CMakeFile) # 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
FILE(GLOB SC_FILES "*.cpp" "*.h") # 指定生成目标
add_executable(${PROJECT_NAME} ${SC_FILES})
生成解决方案

进阶
很多时候,从第三方获取一些功能的源码文件,直接的做法可以放在我们自己的代码文件夹,像上面这样直接引入,但个人觉得这样不利于管理这些文件,特别是某些外部源码文件特别多的时候,就会觉得整个文件夹太多文件了, 很乱。我比较按功能,分放在不同的文件夹下进行管理,如下面我引入md5的相关代码(github就有):
文件夹结构
CMakeFile
|--common
| |--md5
| |--md5.cpp
| |--md5.h
|--CMakeLists.txt
|--main.cpp
|--stdafx.h
修改CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0) # 项目名称
project(CMakeFile) # 设置md5代码文件的路径
set(MD5_FILE "./common/md5/md5.cpp" "./common/md5/md5.h") # 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
FILE(GLOB SC_FILES "*.cpp" "*.h") # 指定生成目标
add_executable(${PROJECT_NAME} ${SC_FILES} ${MD5_FILE})
此处需要设置一个代码文件对应的路径,最后一定要把路径的值添加到生成目标上。
解决方案生成后

这里,就会发现一个问题,md5的代码文件是已经实现分文件夹存放管理了,但在解决方案里还不是分组的哦,我的强迫症又要犯了。
再进阶,解决方案源码分组
为了解决上面的问题,治愈我的强迫症,我再去看了看CMake的手册。原来此时只要在CMakeLists.txt添加一行脚本,调用一个source_group函数就行了:
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0) # 项目名称
project(CMakeFile) # 设置md5代码文件的路径
set(MD5_FILE "./common/md5/md5.cpp" "./common/md5/md5.h") # 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
FILE(GLOB SC_FILES "*.cpp" "*.h") # 对md5的源码分组到md5组里
source_group(md5 FILES ${MD5_FILE}) # 指定生成目标
add_executable(${PROJECT_NAME} ${SC_FILES} ${MD5_FILE})
解决方案再生成后

这里需要注意的是,对CMakeList.txt的其他修改在重新生成后,VS都会提示重新加载解决方案的,但调用source_group函数时,解决方案是不会自动加载的,需要关闭VS重新打开项目。
[CMake笔记] CMake向解决方案添加源文件兼头文件的更多相关文章
- 使用STC-ISP向KEIL添加STC芯片头文件
第一步:打开“STC-ISP”软件. 第二步:点击右手边“Keil仿真设置”,然后点击“添加型号和头文件到Keil中添加STC仿真器驱动到Keil中”. 第三步:在弹出的“浏览文件夹”对话框中,找到你 ...
- 【Keil】Keil5添加源程序和头文件
xxx.c就是源程序 xxx.h就是头文件 [源程序添加方法] 双击文件夹,例如图片上的Source,跳出弹窗,选择需要添加的源程序即可 [添加头文件的方法] 1.首先点击图片红框处,或是在文件夹te ...
- eclipse C开发添加自己的头文件搜索路径
eclipse编译C程序时提示: ..\src\main.c:8:21: fatal error: my_type.h: No such file or directory 如图: 需要添加自己的头文 ...
- 对c&c++源文件和头文件分开的好处的一点认识
对c&c++程序来说,基本上来说都是要把源文件和头文件分别编写.一般都是代表一个基本功能的源文件引用相应的头文件. 一个 相关功能的模块可能有若干对源文件和头文件组成.这是基于组件编程的核心. ...
- Cmake 脚本对项目输出路径和输出头文件的路径定义
对Lib项目的统一输出路径以下时解决方案: set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_O ...
- C学习笔记(9)--- 预处理器,头文件
1.预处理器: 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理. 我们将把 C 预处理 ...
- [理解] C++ 中的 源文件 和 头文件
我是学 C井 的, 现在在工作中主要使用的编程语言是 Java, 还记得当初在第一次接触到 Cpp 的时候, 听到的第一个概念就是 Cpp 的头文件和源文件, 当初理解了好久, 死活都弄不明白, 现在 ...
- QT:创建一个widget,包含源文件,头文件,以及ui文件
1. 安装QT 2. 在QT Welcome画面,点击 New Project 3. 选择Application--Qt Widgets Application 4. 按提示创建即可 文件目录如下: ...
- C源文件和头文件 模版
头文件: /********************************************************************************************** ...
随机推荐
- Win10安装.Net Framework4.7及更高版本
问题描述 使用VS打开项目工程时,提示未安装.net framework4.7,但在启用或关闭windows功能里已经勾选了.net framework 4.7的全部功能. 直接从网上下载.net f ...
- 关于php/js抓取/采集
前段时间用php的一个插件(phpQuery+queryList)写了采集某个博客的一些博文,然后用linux的自动运行跑,感觉还不错. 但在很久之前就已经听说了另外一个插件,可以很好的进行采集,叫做 ...
- html表单中的input元素的两种提交方式比较(get/post)
Http存在两种最常用的提交方式:Get和Post(电话面试有问到两种提交方式的区别) 什么是HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信. HTTP 的工作方式是客 ...
- ASP.NET Core搭建多层网站架构【1-项目结构分层建立】
2020/01/26, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[1-项目结构分层建立] 文章目录 此分支项目代码 ...
- DotNet中静态成员、静态类、静态构造方法和实例构造方法的区别与联系
在面向对象的C#程序设计中,关于静态的概念一直是很多人搞不明白的.下面介绍这些带“静态”的名称. 1.静态成员: 定义:静态成员是用static关键字修饰的成员(包括字段属性和方法) 所属:静态成员是 ...
- QLabel设置伙伴关系和快捷键(Alt+首字母)
Qlabe中设置伙伴关系是使用Setbuddy函数: Qlabel.Setbuddy(QLineEdit) #将Qlabel和QLineEdit之间设置伙伴关系 另外,需要配合热键(快捷键)进行使用, ...
- 翻页插件 jquery
//css <style> * { padding:; margin:; list-style: none; } .wrapper { width: 100%; cursor: point ...
- JavaScript 对象数字键特性实现桶排序
桶排序: 对象中,数字键按照升序排列.依据这一特性将数组的值作为对象的键和值存入对象实现排序 因为对象的键不重复,因此不支持数组有重复元素存在的排序场景,也可以看作是实现数组的去重排序 functio ...
- 免费https/ssl通配证书(letsencrypt)安装
教程:免费https/ssl通配证书(letsencrypt)安装 前置条件 开发443端口 关闭nginx .获取脚本 wget https://dl.eff.org/certbot-auto .执 ...
- java中静态初始化块的执行顺序
在java中,其应该是先于所有的方法执行. 下面是测试代码: public class Test1 { static{ System.out.println("执行静态初始化块test1.. ...