简介
在之前的FreeRTOS学习中我就已经开始尝试使用CLion作为开发工具了,相关内容可以参照CLion开发FreeRTOS的基本配置在近期进行F570无人机开发的过程中同样涉及到了FreeRTOS的相关内容,因此我打算使用CLion进行无人的开发,但是由于该项目中需要使用到不同的外设驱动文件,因此就涉及到了文件管理的相关操作,所以接下来我就会介绍一下相关的文件配置操作
了解项目结构
由于在CLion中进行开发时整个程序是由CMake进行组织和构建的,在软件的侧边栏中我们可以看到对应的项目层级

因此我们关注的重点也就是文档中的CMakeLists.txt,我们可以在该文件中看到程序的属性信息,如果学习过CMake相关知识的话那么对文件中的内容肯定不会陌生。后续我们需要在项目中创建文件夹并添加文件夹时就需要去修改该文件中的内容,直接修改CMakeLists.txt文件对初学者并不友好,但是好处是我们需要用到的配置语句并不复杂,数量也不算多,因此我们可以先简单学习一下相关的CMake知识
CMake简单语法
在学习这部分内容之前我们首先需要了解我们的需求是什么,在编程程序的时候我们会在程序中添加或删除文件以及目录,虽然CLion有时候也会主动帮助我们去修改对应的CMakeLists.txt文件,但是有些时候会出现修改不及时的情况,这便会引发报错,因此现阶段我们需要做的就是能够自己手动的在CMakeLists.txt文件中修改文件编译信息。不过我们如果仔细观察一下就会发现自动生成的CMakeLists.txt文件中的内容和之前我们看过的main.c文件和freertos.c文件很相似,其中都有官方为我们提前准备好的占位符,并用英文为我们提前做好了注释,该文件的内容大家可以在CLion中自行查看,接下来我只会介绍其中与我们现阶段需求相关的内容
添加源文件
当我们在程序中新建了一个目录并在其中创建了一个全新的C语言文件之后我们就需要将它们添加到CMakeLists.txt文件中,该文件中我们可以看到下面部分的代码
cmake
# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here
)
英语好的同学应该一下就能看出来这部分代码的作用是什么,上面的英文注释翻译成中文就是:向可执行文件中添加源文件。因此不难推出如果我们向项目中添加了一个新的源文件,那么我们就应该在这里来添加相关信息
假设我们现在向程序中创建了一个App目录,并在其中创建了串口接收相关的源文件用于处理串口接收任务,源文件的文件名为uart_callback.c,添加完成后我们就需要在CMakeLists.txt文件中上面的代码中添加一条新语句${CMAKE_CURRENT_SOURCE_DIR}/App/uart_callback.c ,添加后对应部分的代码变为
cmake
# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here
${CMAKE_CURRENT_SOURCE_DIR}/App/uart_callback.c
)
我们可以尝试拆解一下该语句,这条语句的内容并不复杂,其中${CMAKE_CURRENT_SOURCE_DIR}是一个占位符,它代表当前程序的根目录,我们可以直接记忆,它也是编写此类添加语句的起手式,因为CMake需要从根目录开始向下寻找对应的文件。此部分之后的内容就是我们添加的目标文件相较于根目录的相对路径。
添加头文件包含目录
如果我们新建了一个包含头文件的文件夹,且我们还在程序中引用了该文件夹中的头文件,那么我们就需要告诉编译器去哪里找这些.h文件,对应部分的代码如下:
cmake
# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths
)
假设我们创建了一个App文件夹,并在该文件夹下又创建了一个Inc文件夹,我们将程序中引用的部分头文件放入了改文件夹中,那么我们就需要使用${CMAKE_CURRENT_SOURCE_DIR}/App/Inc语句将改文件夹添加到程序的头文件搜索路径中,修改后的代码部分如下:
cmake
# 添加头文件搜索路径
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths
${CMAKE_CURRENT_SOURCE_DIR}/App/Inc
)
该命令和添加源文件的命令形式极为相似,我们可以类比的去记忆
进阶管理
随着项目变得越来越复杂,我们需要控制的外设也越来越多,业务裸机也变得越来越复杂,也必然会创建更多的文件,如果我们将所有的文件都一股脑的放到target_sources 下,那么过不了多久该部分的代码就会变得无比臃肿,因此我们可以想办法通过定义变量来解决这一问题,我们可以将文件的路径信息保存到变量中,然后再将变量导入到target_sources 下,示例代码如下:
cmake
# 1. 定义模块变量
set(APP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/App/main_task.c ${CMAKE_CURRENT_SOURCE_DIR}/App/motor_control.c )
set(DRIVER_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/Custom/imu_sensor.c ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/Custom/can_bsp.c )
我们可以定义两个变量,一个用于存放业务逻辑相关的文件信息,另一个用于存放驱动文件的文件信息,然后我们再将这两个变量导入到target_sources中
cmake
# 2. 将变量展开并添加到工程源文件中
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
${APP_SOURCES}
${DRIVER_SOURCES}
)
对于初学者来说可能会感觉到疑惑的事是,为什么CMakeLists.txt文件中默认什么源文件路径都没有?按理说这样不会引发报错吗?这种怀疑是正确的,我们可以在CMakeLists.txt文件中看到这样一句话

红色方框内的语句作用是添加其它文件夹下的CMakeLists.txt文件来导入编译信息,在程序中括号内的文件夹内刚好有一个CMakeLists.txt文件

该文件夹中就包含了所有由CubeMX自动生成的源文件、HAL库外设驱动文件、以及系统启动文件
总结
在以CMake为基础的项目中我们进行文件管理的方式更加现代化,但是这个操作的过程无法像之前在keil中那样通过图形化界面进行操作,但是在我看来通过修改配置文件进行项目管理的效率是要优于图形化操作的,大家感兴趣的话也可以去尝试学习更多CMake相关的知识,这样在后续的开发中才能达到事半功倍的效果