xtensa-lx106-elf-gcc 未定义引用?

Undefined reference with xtensa-lx106-elf-gcc?

我正在使用 Arduino IDE 并计划稍后转向 VSCode/Makefile 解决方案。

如果所有代码都属于主草图,我有一个编译和运行良好的项目。一旦我分离代码,链接步骤就会失败。

我把它归结为一个简单的演示:

什么有效

草图文件

#ifdef __cplusplus
extern "C" {
#endif
void methodCall();
#ifdef __cplusplus
}
#endif
void setup() {
  // put your setup code here, to run once:

}

void loop() {
 methodCall();
}

void methodCall() {
  random(0,1);
 }

什么失败了

草图文件

#ifdef __cplusplus
extern "C" {
#endif
void methodCall();
#ifdef __cplusplus
}
#endif
void setup() {
  // put your setup code here, to run once:

}

void loop() {
 methodCall();
}

Methods.c 文件通过 Sketch 添加到 Arduino IDE sketch>'Add File'

void methodCall() {
  random(0,1);
 }

Platform.txt修改?

有些问题建议在ESP8266文件夹的platform.txt文件中的compiler.c.elf.libs行添加-lstd++,但是好像不行为我产生任何结果,除了较早的 build.stdcpp_lib=-lstdc++ 行似乎可以解决这个问题。

关于 headers

的注意事项

如果方法声明由源文件 header 文件 #included 外部化,则错误是相同的。 random 函数在 esp8266/Arduino.h 中声明并定义 here.

我做错了什么?

Arduino 的 Github

根据 https://github.com/esp8266/Arduino/issues/1283,其中 Links2004 指出:

random is a API function from Arduino not working on C

答案似乎是将对 random 的调用替换为对 rand 的调用。测试表明,在该演示源和真实源中,将 random()randomSeed 替换为 rand 和基于 srand 的修改可以正确编译和运行。

已修复?

如果有人有更好的选择,允许从 C 代码使用 C++ random 函数,我会很乐意用他们的替换我的“解决方案”。 令我感到沮丧的是,Arduino 伪装成 C++ 的 C 代码可以编译,但是将同一个源代码分成几个文件却不能编译,并且需要源代码本身调用不同的函数。