在gcc linux中编译时出现一堆错误和警告

时间:2015-07-08 06:21:48

标签: c++ c gcc gnu compiler-warnings

这段代码过去几个月前没有错误编译过。我丢失了VM映像,因此我使用最新的GCC和库设置了一个新的Linux VM。但现在我收到了这些错误和警告。

In file included from /opt/Espressif/ESP8266_SDK/include/ets_sys.h:12:0,
                 from include/espmissingincludes.h:4,
                 from driver/i2c.c:20:
driver/i2c.c: In function 'i2c_init':
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:247:94: error: suggest parentheses around arithmetic in operand of '|' [-Werror=parentheses]
 #define PIN_FUNC_SELECT(PIN_NAME, FUNC)  do {WRITE_PERI_REG(PIN_NAME,READ_PERI_REG(PIN_NAME) & (~(PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) |( (((FUNC&BIT2)<<2)|(FUNC&0x3))<<PERIPHS_IO_MUX_FUNC_S) );} while (0)
                                                                                              ^
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:50:87: note: in definition of macro 'WRITE_PERI_REG'
 #define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) =(val)
                                                                                       ^
driver/i2c.c:64:5: note: in expansion of macro 'PIN_FUNC_SELECT'
     PIN_FUNC_SELECT(I2C_SDA_MUX, I2C_SDA_FUNC);
     ^
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:247:94: error: suggest parentheses around arithmetic in operand of '|' [-Werror=parentheses]
 #define PIN_FUNC_SELECT(PIN_NAME, FUNC)  do {WRITE_PERI_REG(PIN_NAME,READ_PERI_REG(PIN_NAME) & (~(PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) |( (((FUNC&BIT2)<<2)|(FUNC&0x3))<<PERIPHS_IO_MUX_FUNC_S) );} while (0)
                                                                                              ^
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:50:87: note: in definition of macro 'WRITE_PERI_REG'
 #define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) =(val)
                                                                                       ^
driver/i2c.c:65:5: note: in expansion of macro 'PIN_FUNC_SELECT'
     PIN_FUNC_SELECT(I2C_SCK_MUX, I2C_SCK_FUNC);
     ^
cc1: all warnings being treated as errors
make: *** [build/driver/i2c.o] Error 1

有谁知道如何解决这些问题?

1 个答案:

答案 0 :(得分:2)

您将警告视为错误,可能是通过使用-Werror进行构建。如果删除该标志,则应编译代码,或添加-Wno-error=parentheses

但是,如果代码是您的(而不是像第三方库那样),那么修复根本原因是值得的。您可以通过在正确的位置添加括号来修复宏,但我认为通过使这些宏成为真正的函数可以更好地服务。