问题

装了STM32CubeMX之后VSCode里就用不了gcc了。

F:\Projects\c>gcc F:\Projects\c\2.c -o F:\Projects\c\2.exe
gcc: fatal error: cannot execute 'cc1 ': CreateProcess: No such file or directory 
compilation terminated.

使用 ucrt 工具链安装了 gcc , 在 ucrt 终端中可以正常编译输出。

直接运行 cc1.exe 报错显示:

询问AI得知这个函数位于 libwinpthread-1.dll

终端运行:

C:\Users\Pluviophile>where libwinpthread-1.dll
C:\Program Files (x86)\STMicroelectronics\stlink_server\libwinpthread-1.dll
F:\Program Files (x86)\IDEs\STN32CubeCLT_1.20.0\st-arm-clang\bin\libwinpthread
-1.dll
F:\Program Files (x86)\IDEs\STN32CubeCLT_1.20.0\STN32CubeProgrammer\bin\libwinpthread-1.dll
F:\msys64\ucrt64\bin\libwinpthread-1.dll
F:\mi\tools\adb-fastboot\libwinpthread-1.dll
F:\OpenoCD\bin\libwinpthread-1.dll

可见最先调用的是STM32Cube套件的库, 因为这个bin在安装STM32Cube时被写进了系统变量的path中。

但是由于ST使用的库函数过于老旧, 这个旧版dll中没有 clock_gettime64 这个函数, 所以gcc在编译过程中调用cc1时就会报错。

解决方式

因为用户变量优先级低于系统变量, 且需要保证STM32Cube正常运行, 所以只能委屈一下gcc了。

msys64/ucrt/bin 中的全部dll文件复制到 msys64/ucrt/lib/gcc/x86_64_mingw32/版本号 下。这是因为程序在运行时会优先在本目录下查找所需的库文件, 找不到才去path中找, 所以把gcc自己的dll拿过来就可以了。

然后gcc就可以正常编译了。