定义 .h 文件的相对路径 (C++/ Arduino)

Define a relative path to `.h` file (C++/ Arduino)

有一个 .h 文件需要由 2 个 Arduino 文件(又名“草图”)访问。

需要使用相对路径,因为代码是使用 2 平台 Linux 和 Mac 编译的,因此路径不能相同。

 |-DIR_A
 |     |-DIR_B (incl. Sketch1)
 |     |
 |     |-DIR_C (incl. Sketch2)
 |     |
 |     |-libfile.h

在我输入的草图之一中:

#include "../SerialProtocol.h",但编译失败:

compilation terminated. exit status 1 ../SerialProtocol.h: No such file or directory

我们将不胜感激。

Arduino 构建系统将您的所有文件复制到一个临时目录中,因此您最终会得到如下内容:

- TEMP
  - dir_b.tmp123 (contains dir_b sketch files)
  - dir_c.tmp456 (contains dir_c sketch files)

libfile.h 永远不会被复制!

既然您知道问题所在,那么解决它就很容易了。这里有两个建议...

建议 1

如果你在 Linux 和 Mac,而不是 Windows,那么你可以使用符号链接解决这个问题:

|-DIR_A
|     |-DIR_B (incl. Sketch1)
|     |  |-src
|     |  |   |-shared_src (linked)
|     |
|     |-DIR_C (incl. Sketch2)
|     |  |-src
|     |  |   |-shared_src (linked)
|     |
|     |-shared_src

使用

创建链接
cd dir_b
mkdir src && cd src
ln -s ../../shared_src shared_src

cd ../../dir_c
mkdir src && cd src
ln -s ../../shared_src shared_src

我建议您使用 src 文件夹,因为您还可以在其中放置 .c.cpp,Arduino 会将它们与您的项目一起编译。现在包括您的库使用:

#include "src/shared_src/SerialProtocol.h"

建议 2

按照老派的 C-Way :D

如果你不需要同时处理两个草图,那么你可以把它做成一个大草图,我称之为 good_program 由两个程序组成:senderreceiver

good_program/good_program.ino

#define PROG_SENDER 1
#define PROG_RECEIVER 2

#define PROG PROG_SENDER

good_program/prog_sender.ino

#if PROG == PROG_SENDER

void setup(){...}
void update(){...}

#endif

good_program/prog_receiver.ino

#if PROG == PROG_RECEIVER

void setup(){...}
void update(){...}

#endif

Arduino builder 需要 sketchbook 文件夹中 libraries 文件夹中的库。正常的做法是在那里创建一个文件夹 mylib 并将 h(如果需要的话还有 cpp)文件放在那里。即使 Arduino IDE 库管理器在那里安装了库,它仍然是你的 libraries 文件夹,你应该把你的代码放在那里。

我了解到您有一个项目,其中包含两个用于通信的 MCU 的两个草图,header 文件包含共享定义和常量。

在类似的情况下,我有一个这样的文件夹结构

|-DIR_A
|     |-DIR_B (incl. Sketch1)
|     |  |-sketch 1 files
|     |
|     |-DIR_C (incl. Sketch2)
|     |  |-sketch 2 files
|     |
|     |-LIB_DIR
|     |  |-shared_src

然后我将文件夹 LIB_DIR 的文件系统 link 放入 libraries 文件夹中。它适用于 Windows 和 Linux。

这样您就可以包含没有路径的共享 header。