您如何正确使用 /GUARD:CF MSVC 标志?

How do you correctly use /GUARD:CF MSVC flag?

我正在尝试使用 /GUARD:CD MSVC 标志。从 the documentation,它说

The /GUARD:CF option must be specified to both the compiler and linker

文档还说 /GUARD:CF 也需要设置 the /DYNAMICBASE option

但是,当我尝试编译时,我看到了无法识别选项的警告:

cl -c /W3 /O2 /EHsc /MP /Zi /nologo /MD /Zi /DUNICODE /D_UNICODE /D_CRT_SECURE_NO_DEPRECATE /LD -Isrc -Iimport/include -D_WINDOWS -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL /GS /DYNAMICBASE /GUARD:CF /Fo: redacted.cpp.obj redacted.cpp
cl:命令行警告 D9002:忽略未知选项“/GU”
cl:命令行警告 D9002:忽略未知选项“/GD”
cl:命令行警告 D9002:忽略未知选项“/G:”
cl:命令行警告 D9002:忽略未知选项“/GC”

起初我以为我可能不小心在我的文本编辑器中引入了不可打印的字符,但我用 cat --show-nonprinting 证实情况并非如此。

如何正确地将 /GUARD:CF 传递给 MSVC cl 编译器以便它识别它?

您链接的文档(关于 linker /GUARD 选项)具有误导性,但如果您查看 真的很难:

对于编译器,命令行选项需要小写(但链接器似乎接受大写或小写)。

因此,在 cl 命令行中使用 /guard:cf 而不是 /GUARD:CF

来自linked document

When source code is compiled by using the /guard:cf option, …

并且,在 /guard:cf 链接到的页面上,开关仅以小写形式给出。

您link编辑的页面是 MSVC linker 选项手册的一部分。链接器选项不区分大小写。该页面有一个 link 到 MSVC 编译器选项的手册:

When source code is compiled by using the /guard:cf option.

编译器选项区分大小写。正确的 cl 调用

cl -c /W3 /O2 /EHsc /MP /Zi /nologo /MD /Zi /DUNICODE /D_UNICODE /D_CRT_SECURE_NO_DEPRECATE /LD -Isrc -Iimport/include -D_WINDOWS -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL /GS /DYNAMICBASE /guard:cf  /Fo: redacted.cpp.obj redacted.cpp

只是想知道。 linker 和编译器的禁用保护是不同的:/GUARD:NO/guard:cf-.