GCC 7.3.0预处理器因输出文件不存在报错是否为版本问题?
GCC 7.3.0预处理器输出文件检查的行为变更问题
你遇到的这个问题确实是GCC 7.x系列预处理器的行为变更导致的,和GCC 6及更早版本的处理逻辑不一样。
问题根源
在GCC 6及之前的版本中,直接调用cpp命令时,如果指定的输出文件不存在,预处理器会自动创建该文件并写入处理结果。但从GCC 7开始,预处理器增加了对输出文件存在性的检查——如果目标输出文件不存在,就会抛出No such file or directory的错误,这是官方为了提升错误检测严谨性做出的调整。
解决方法
针对这个问题,你有两个可行的解决方向:
预创建输出文件
在执行cpp命令前,先手动创建空的输出文件,比如:touch libipmiconsole.3之后再运行原来的cpp命令,就能正常执行了。如果是在Makefile中遇到这个问题,可以在对应的编译规则前添加创建空文件的步骤。
改用
gcc -E调用预处理器
避免直接调用cpp,而是通过GCC的-E参数来触发预处理流程,gcc -E会自动处理输出文件的创建,不需要提前存在。修改后的命令如下:gcc -E -nostdinc -w -C -P -I../man libipmiconsole.3.pre -o libipmiconsole.3这个方式更适配不同GCC版本的行为,能同时兼容GCC 6和GCC 7。
验证说明
你可以测试一下上述方法:先创建空文件再执行原命令,或者替换成gcc -E的形式,应该就能解决预处理器报错的问题了。这不是FreeIPMI的代码问题,纯粹是GCC版本间的行为差异导致的。
内容的提问来源于stack exchange,提问作者HEKTO
相关产品推荐
相关产品推荐

