将Arduino编译为C++,而不是C

3

我正在尝试在Arduino上使用Supermodified Servo。目前我的代码中没有实际的代码,我只是在尝试编译库时出现了很多错误。

经过一些研究,我发现如果将我的代码编译为C而不是C ++,我就不会得到这些错误。但我不知道如何做到这一点!

我正在使用适用于Linux x64的Arduino 1.0。

@Omnifarious 我的arduino草图中只有#include指令,目前是sketch_jan20.cpp

我添加了

#ifd __cplusplus{
extern "C"
#endif

除了一个问题之外,这有助于解决下面的错误:布尔值的重新定义。当我注释掉那一行时,出现了许多新的错误。所有的错误都是相同的,包括以下变化的某种形式:

C:\Users\Ventrius\Programming\Arduino1.01\libraries\ArduinoApiC\/zoCommands.h:131: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'zoCommandDoMove'

错误信息:

avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=100 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -I/usr/share/arduino/libraries/ArduinoApiC /tmp/build3069866408398264713.tmp/sketch_jan20a.cpp -o/tmp/build3069866408398264713.tmp/sketch_jan20a.cpp.o 
In file included from /usr/share/arduino/libraries/ArduinoApiC/zoSmsMaster.h:4:0,
                 from sketch_jan20a.cpp:1:
/usr/share/arduino/libraries/ArduinoApiC/zoTypes.h:39:18: error: redeclaration of C++ built-in type ‘bool’
In file included from /usr/share/arduino/libraries/ArduinoApiC/zoSmsMaster.h:5:0,
                 from sketch_jan20a.cpp:1:
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:19:29: error: non-local function ‘void zoErrorInit(volatile ZO_ERROR*)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:20:27: error: non-local function ‘u08 zoErrorGet(volatile ZO_ERROR*)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:21:44: error: non-local function ‘void zoErrorPut(volatile ZO_ERROR*, u08)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:22:32: error: non-local function ‘bool zoErrorIsEmpty(volatile ZO_ERROR*)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:24:30: error: non-local function ‘u08 zoErrorGetIsr(volatile ZO_ERROR*)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:25:47: error: non-local function ‘void zoErrorPutIsr(volatile ZO_ERROR*, u08)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
In file included from /usr/share/arduino/libraries/ArduinoApiC/zoSmsMaster.h:6:0,
                 from sketch_jan20a.cpp:1:
/usr/share/arduino/libraries/ArduinoApiC/zoProtocol.h:93:26: error: non-local function ‘bool zoProtocolCommandResponse(ZO_PROTOCOL_HAL*, ZO_PROTOCOL_PACKET*, volatile ZO_ERROR*)’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: error: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage
In file included from sketch_jan20a.cpp:1:0:
/usr/share/arduino/libraries/ArduinoApiC/zoSmsMaster.h:55:18: warning: non-local variable ‘volatile ZO_ERROR* zoSmsMasterError’ uses anonymous type
/usr/share/arduino/libraries/ArduinoApiC/zoError.h:15:2: warning: ‘typedef volatile struct<anonymous> ZO_ERROR’ does not refer to the unqualified type, so it is not used for linkage

1
那么,你的代码是C还是C++?不是很清楚。在我看来似乎是C。顺便问一下,你为什么要尝试将其编译为C++呢? - netcoder
根据这些错误中的代码片段,可以判断该代码肯定无法使用标准的C编译器进行编译。一般来说,我建议使用完全符合标准的C或C++编译器,不要使用任何语言扩展,_尤其是_如果你是一个试图学习嵌入式编程的初学者。 - Lundin
@Lundin:看起来这些错误根本不在程序中,而是在Arduino头文件中。我怀疑.cpp文件里只有包含指令,没有其他内容。 - Omnifarious
你可以在下面留言回复,我会将你的文件重命名为.c而不是.cpp,并使用avr-gcc进行编译。这样就能正常工作了。用extern "C"包装你的#include是错误的做法。Arduino似乎有一个C++接口,你为什么要#include那个特定的文件呢? - Omnifarious
这是我正在使用的伺服电机的API。它以前可以工作,但我已经有两年没有碰过它了。该项目在Google Code上已经死亡。至于重命名我的文件,我不能这样做。Arduino软件设置为自行编译avr-g++。我不知道如何将我的草图保存为“.c”文件。 - Windsplunts
显示剩余4条评论
1个回答

2

这个回答并不是很有用,只是我尝试应对问题的混乱性。

将你的文件重命名为 .c 并使用 avr-gcc 编译它们,而不是使用 avr-g++

如果出现错误,那就意味着你需要调整你的程序,甚至可能需要重新编写,以避免使用任何 C++ 特性。

没有通用的公式可以将 C++ 程序转换为 C。

另一个选项是创建一个 C 层,让你的 C++ 代码来调用。这个 C 代码层将具有 C++ 友好的函数定义(即没有 bool 等),然后调用 Arduino 库中的非 C++ 友好代码。

然后,你可以创建包含函数定义的头文件,这些函数定义被包含在 extern "C" { ... } 中。确保这些头文件不包含你正在使用的 Arduino 库的任何头文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接