定义 .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
由两个程序组成:sender
和 receiver
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。
有一个 .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
由两个程序组成:sender
和 receiver
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。