Gcc 我的编译器没有';t按预期分析转义序列

Gcc 我的编译器没有';t按预期分析转义序列,gcc,makefile,escaping,Gcc,Makefile,Escaping,我正在尝试使用工具对代码进行静态分析。生成文件包含: export TASK=MY_TASK_NAME my_static_code_tool.exe <arguments> -- gcc <arguments..> -D__TASK_NAME__=\"$(TASK)\" -o missionFile.o missionFile.c 我得到的错误是: gcc:没有输入文件 我非常肯定我的论点都是正确的,我指的是正确目录中的源代码。在我看来,--似乎停止了Windows上

我正在尝试使用工具对代码进行静态分析。生成文件包含:

export TASK=MY_TASK_NAME
my_static_code_tool.exe <arguments> -- gcc <arguments..> -D__TASK_NAME__=\"$(TASK)\" -o missionFile.o missionFile.c
我得到的错误是:

gcc:没有输入文件

我非常肯定我的论点都是正确的,我指的是正确目录中的源代码。在我看来,
--
似乎停止了Windows上命令中转义序列的解析。有人能帮我解决吗?

工具使用
--
介绍编译器及其参数[从而通知工具以下内容是特定于编译器的]。GCC在Makefile中定义了所有必需的源/文件/配置。但是,它没有在Cygwin shell中完全处理(命令处理因转义而停止,因此出现了相应的gcc错误)

我采用的解决方案是预处理器严格化

C文件:

#define STRINGIFY_IT(str) STRING_OF(str)
#define STRING_OF(str) #str

const unsigned char TASK_NAME[] = STRINGIFY_IT(__TASK_NAME__);
生成文件:

export TASK=MY_TASK_NAME
my_static_code_tool.exe <arguments> -- gcc <arguments..> -D__TASK_NAME__=$(TASK) -o missionFile.o missionFile.c
export TASK=MY\u TASK\u NAME
my_static_code_tool.exe--gcc-D_uutask_NAME_uuu=$(TASK)-o missionFile.o missionFile.c

因此,如果将来有人在使用第三方工具时遇到此类问题,请尽量不要通过命令行将字符串参数传递给GCC(因为它们需要转义,可能会破坏命令)

这与GCC没有解析无关-它与GCC没有提供它所期望的[input]文件有关。没有文件,没有要解析/编译的内容。那么,什么叫gcc(例如什么是“我的静态代码工具”),为什么不提供预期的参数?这个工具是否仅仅具有环境兼容性(例如,它是否使用不同的shell来启动gcc)?我不完全理解。我的假设是,gcc不需要工具为其功能提供参数。该工具需要编译的对象。gcc有源文件、目标文件名和执行编译所需的参数。我还想说,如果我删除-,编译运行良好,没有这个错误。“gcc:没有输入文件”-因此,gcc没有获得有效的源代码/文件/配置,并立即退出。标准shell中的
--
没有什么特别之处。这是一个由特定程序理解的论点,用来做不同的事情。在git中,也就是说,它的用法类似于
git checkout rev--file
,但是
--
没有固有的shell魔力,也不会改变shell调用git命令的方式;
文件
部分仍受所有常规shell解析规则的约束。(现在引号\escapes\变量在不同的shell中可能会得到不同的处理。Windows会略微改变可执行参数的提供方式,尽管Cygwin试图隐藏这一点。)
export TASK=MY_TASK_NAME
my_static_code_tool.exe <arguments> -- gcc <arguments..> -D__TASK_NAME__=$(TASK) -o missionFile.o missionFile.c