我使用 STM32CubeIDE 通过“文件”>“新建”>“STM32 项目”为我的 nucleo-f411re 板创建了一个新的 (C++) 项目。该项目像往常一样创建。因为我选择 C++ 作为目标语言,所以我将“main.c”重命名为“main.cpp”。一个简单的“blinky”编译并在板上正确运行。所以现在我想开始向项目添加一些 C++ 代码。
“main.cpp”位于项目树中的 myproject > Core > Src > main.cpp 下。如果我想创建一些新的源/头文件,例如“foo.h”和“foo.cpp”,我想我可以右键单击项目树中的某些内容,然后“新建”>“头文件”或“新建”>“源文件”。但问题是——我右键单击什么来创建源文件/头文件?我假设该文件将在我右键单击的位置(=文件夹)中创建。我想把它们放在哪里?它们都在“Core”文件夹中吗?分别在“Core > Inc”和“Core > Src”文件夹中?我不知道。
编辑:我分别将头文件/源文件添加到 Core > Inc 和 Core > Src,这似乎有效。是推荐的吗?我想知道如果我更改配置,它们是否仍然存在,导致代码重新生成。
小智 9
我知道这是一个很晚的答案,但不久前我没有找到关于这个问题的很多提示,所以这是我的看法。
基本上您可以将源文件放置在任何源文件夹中。您可以根据需要使用现有文件夹或创建新文件夹。
头文件必须放置在包含路径(例如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
| + ...
+ ...
Run Code Online (Sandbox Code Playgroud)
您必须将Program/Inc任何Lib/Inc文件夹添加到包含路径中。然后的更改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
| + ...
+ ...
Run Code Online (Sandbox Code Playgroud)
在文件中cppmain.h,我通常#include "main.h"会获取所有 STM32 HAL 内容并将所有硬件资源句柄声明为 extern (例如extern UART_HandleTypeDef huart1;)
完整cppmain.h文件:
...
/* 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 */
}
...
Run Code Online (Sandbox Code Playgroud)
一些随机cppmain.cpp文件:
/** @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_ */
Run Code Online (Sandbox Code Playgroud)
在我的Lib文件夹中,我通常链接到我想要在处理所有项目时更改的库:right click on Libs -> New -> Folder -> Advanced >> -> Link to alternate location. 请注意,这将链接到您系统上的绝对路径,并且您不能简单地以这种方式将项目导入到不同的系统上。如果您在团队中工作或跨不同设备工作,您可能希望以不同的方式解决此问题。
| 归档时间: |
|
| 查看次数: |
12718 次 |
| 最近记录: |