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 文件 #include
d 外部化,则错误是相同的。 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 代码可以编译,但是将同一个源代码分成几个文件却不能编译,并且需要源代码本身调用不同的函数。
我正在使用 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 文件 #include
d 外部化,则错误是相同的。 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 代码可以编译,但是将同一个源代码分成几个文件却不能编译,并且需要源代码本身调用不同的函数。