我在编译一个非常简单的代码时遇到了一些非常奇怪的问题
typedef volatile struct _underflow_test
{
unsigned int OPERATION_MODE;
unsigned int UNDERFLOW;
} underflow_test;
使用gcc12.2
无法在MSYS 2中编译此代码。使用-E
选项,我已检查有关代码是否转换为以下内容:
typedef volatile struct _underflow_test
{
unsigned int OPERATION_MODE;
unsigned int
# 4137 "C:/Users/work/eec_control/TC367_project/Libraries/Infra/Sfr/TC36A/_Reg/IfxGeth_regdef.h" 3
4
# 4137 "C:/Users/work/eec_control/TC367_project/Libraries/Infra/Sfr/TC36A/_Reg/IfxGeth_regdef.h"
;
} underflow_test;
所以预处理器将UNDERFLOW
转换为4。然后这个转换无法编译。使用gcc11
不会这样做-它不会将UNDERFLOW
字段转换为4。
两种情况下的命令行相同:
cd C:/Users/work/build-eec-gnu/core_files/bsp && C:/msys64/mingw64/bin/gcc.exe
-DROOT_INSTALL_DIR="\"C:/Program Files (x86)/eec-control\""
@CMakeFiles/bsp-core-tc367-a1.dir/includes_C.rsp
-Wall -Wextra -Wno-unknown-pragmas -Wfloat-equal -Wconversion -Wparentheses -Wunused-parameter -Wunused-variable -Wstrict-prototypes
-DMAJOR_RELEASE_NUMBER=1 -DMINOR_RELEASE_NUMBER=0 -DPATCH_RELEASE_NUMBER=42 -E -O0 -DNDEBUG -g
-fdiagnostics-color=always -std=gnu99 -MD -MT core_files/bsp/CMakeFiles/bsp-core-tc367-a1.dir/hal.c.obj
-MF CMakeFiles/bsp-core-tc367-a1.dir/hal.c.obj.d -o CMakeFiles/bsp-core-tc367-a1.dir/hal.c.obj
-c C:/Users/work/eec_control/core_files/bsp/hal.c
有谁知道是什么原因导致了这种现象,以及如何解决这种奇怪的效果吗?也许我漏掉了什么。
1条答案
按热度按时间3htmauhk1#
感谢Ian Abbot向正确的方向推进。这是由于公共代码和我的供应商代码之间的
#define
冲突造成的。供应商的代码要求严格的ANSI代码而没有GNU扩展。修复方法是使用
set(CMAKE_C_EXTENSIONS OFF)
设置CMake扩展标志。