stm32cubeide - 在 STM32CubeIDE 项目中添加新的 .h 和 .cpp 文件的位置
问题描述
我使用 STM32CubeIDE 通过 File > New > STM32 Project 为我的 nucleo-f411re 板创建一个新的 (C++) 项目。该项目像往常一样创建。我将“main.c”重命名为“main.cpp”,因为我选择了 C++ 作为目标语言。一个简单的“blinky”编译并在板上正确运行。所以现在我想开始向项目中添加一些 C++ 代码。
“main.cpp”位于 myproject > Core > Src > main.cpp 下的项目树中。如果我想创建一些新的源/头文件,比如“foo.h”和“foo.cpp”,我想我可以右键单击项目树中的某些内容,然后新建 > 头文件或新建 > 源文件。但问题是——我应该右键单击什么来创建源/头文件?我假设文件将在我右键单击的位置(=文件夹)中创建。我想把它们放在哪里?他们都在“核心”文件夹中?分别在“Core > Inc”和“Core > Src”文件夹中?我不确定。
编辑:我分别将头文件/源文件添加到 Core > Inc 和 Core > Src,这似乎有效。这是推荐的吗?我想知道如果我更改配置,它们是否还会在那里,导致重新生成代码。
解决方案
我知道这是一个很晚的答案,但不久前我没有找到很多关于这个问题的提示,所以这是我的看法。
基本上你可以将源文件放在任何源文件夹中。您可以随意使用现有文件夹或创建新文件夹。
头文件必须放在包含路径(例如Core/Inc
)中的文件夹中,或者您必须告诉编译器应该包含特定文件。如果你想为你的头文件创建一个新文件夹,你必须将这个文件夹中的一个或多个文件夹添加到包含路径中Project -> Properties -> C/C++ Build -> Tool Setting (tab) -> MCU GCC Compiler or MCU G++ Compiler -> Include paths
。请注意,您可能需要添加两次,一次用于 C 文件 ( MCU GCC Compiler
),一次用于 C++ 文件 ( MCU G++ Compiler
)。
要创建文件,您只需单击要在其中创建它的文件夹并添加一个新的 <whatever> 文件。您也可以在本地文件系统上创建文件和目录并刷新项目(右键单击 -> 刷新或 F5)以显示 STM32CubeIDE 中的更改。
对于小型项目(如眨眼项目),仅使用该Core
文件夹可能就足够了。
对于更大的项目,我个人喜欢将所有自动生成的代码与我自己的文件分开。特别是对于 C++ 项目,每次运行代码生成时,STM32CubeIDE 总是重命名和删除您不小心放在注释块之外的代码段main.cpp
,这会变得非常烦人。main.c
我通常Project
为项目特定文件创建一个源文件Lib
夹,为库创建一个源文件夹。然后我创建一个cppmain.h
文件,它简单地声明一个void cppMain()
函数和一个cppmain.cpp
用于编写我的主程序的文件。对自动生成代码的唯一更改是您必须在主循环之前包含cppmain.h
并调用.cppMain()
main.c
目录树:
Project name
+ Core
| + ...
+ Drivers
| + ...
+ Libs
| + someLib
| | + Inc
| | | + someLib.h or hpp
| | + Src
| | + someLib.c or cpp
| + ...
+ Program
| + Inc
| | + cppmain.h
| | + ...
| + Src
| + cppmain.cpp
| + ...
+ ...
您必须将Program/Inc
任何Lib/Inc
文件夹添加到包含路径。然后的更改main.c
如下所示:
...
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cppmain.h" // this goes in user includes
/* USER CODE END Includes */
...
/* USER CODE BEGIN 2 */
cppMain(); // this goes before the main loop
// anything after this point will never be reaced
// when you create a main loop inside cppMain()
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
...
在cppmain.h
文件中,我通常#include "main.h"
会获取所有 STM32 HAL 内容并将所有硬件资源句柄声明为 extern(例如extern UART_HandleTypeDef huart1;
)
完整cppmain.h
文件:
/** @file cppmain.h
*
* @author some_author
* @date some_date
*/
#ifndef PROGRAM_INC_CPPMAIN_H_
#define PROGRAM_INC_CPPMAIN_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
void cppMain(void);
#ifdef __cplusplus
}
#endif
#endif /* PROGRAM_INC_CPPMAIN_H_ */
一些随机cppmain.cpp
文件:
/** @file cppmain.cpp
*
* @author some_author
* @date some_date
*/
#include "cppmain.h"
#include "pins.h"
// pins is useful when you connect some things to a dev board
// and want to have a quick reference where you put stuff
// this just includes things like (for STM32F103xB "blue pill" in this case)
// #define LED_PIN_PORT GPIOC
// #define LED_PIN_PIN GPIO_PIN_13
// #define LED_PIN LED_PIN_PORT, LED_PIN_PIN
extern UART_HandleTypeDef huart1;
int some_variable = 0;
void foo(int input){
// do something
}
void cppMain(){
// do stuff
// main loop
while(1){
// do stuff regularly
}
}
在我的Lib
文件夹中,我通常会链接到我想在处理它们时为所有项目更改的库:right click on Libs -> New -> Folder -> Advanced >> -> Link to alternate location
. 请注意,这将链接到系统上的绝对路径,您不能以这种方式简单地将项目导入不同的系统。如果您在团队中或跨不同设备工作,您可能希望以不同的方式解决这个问题。
推荐阅读
- python - 将 25 gigs 文本文件加载到 Mysql(python 脚本或 LOAD DATA)的最佳方法?
- c - VSCode 'Go to definition' 不仅仅适用于大型项目
- c# - 在静态类中配置静态 StreamWriter
- flutter - 如何在 Flutter 中制作弧形底部 appBar?
- html - 仅使用 `direction: rtl` 样式化元素
- javascript - 可以对字符串数组进行编码吗?
- javascript - 如何从 gulp src 流中排除所有 node_modules 目录?
- r - 从具有未知数量参数的模型动态构建表达式以获得相当的标签
- flutter - 颤动如何使用共享首选项保存动态列表?
- python - 更改 ylabel matplotlib 上的刻度大小