如何使用 VS 编译器将预处理文件编译成目标文件

Posted

技术标签:

【中文标题】如何使用 VS 编译器将预处理文件编译成目标文件【英文标题】:How to compile a preprocessed file into object file using VS compiler 【发布时间】:2019-06-05 12:17:46 【问题描述】:

cl.exe(Visual Studio C/C++ 语言编译器)将源文件编译为带有 /P 标志的预处理文件,例如cl /P Source.c 创建 Source.i

我想把这个 Source.i(不是 Source.c)编译成 Source.obj。我该怎么做?找不到将预处理文件作为输入的标志。

【问题讨论】:

预处理器输出不应包含任何可预处理的内容。如果您尝试正常编译它会失败什么?你能显示你正在使用的命令行吗? 预处理文件只是一个普通的 C++ 文件。它可以在没有任何标志的情况下编译。 只需将其重命名为带有 .c 扩展名的名称,并在不带 /P 标志的情况下编译它。预处理器仍将被执行(这是编译的一个阶段),但由于文件已经过预处理,因此对目标文件应该没有明显的影响。请记住,预处理文件可能会使用特定于编译器的扩展,因此您(通常)无法使用其他工具链编译预处理代码。 由于输出文件具有“i”扩展名,编译器无法检测到语言。所以可能你必须使用一些标志来强制语言或将接受扩展名添加到文件名 我已经有了.c文件,所以我可以直接编译成.obj.lib。我正在寻找的是将编译从预处理转移到编译。 【参考方案1】:

你不需要做任何特别的事情。它是一个有效的 C++ 源文件,它只用于您的编译器。 (虽然它不是一个可移植的源文件,因为所有工具链自己的标准库 gubbins 以及其他任何东西都已扩展。)

这里唯一的技巧是,“中间”步骤通常由前端为您完成,获取预处理的源代码并将其传递给“真正的”编译器。但你仍然可以自己做。

但是,您可能想要重命名它,使其具有一个不错的类似 C++ 的扩展名。否则,您可以通过 /Tp 强制将您的文件视为 C++,而不管扩展名如何。 (对于 GCC,这将是 -x c++。)

要注意的另一件事是,它仍然会在您的文件上运行预处理步骤,不知道不再需要它(所有 preproc 指令已经在您的第一步扩展),所以有点浪费额外的时间。但这不是(或不应该是)典型的工作流程。

cl /P Source.c
cl /Tp Source.i

【讨论】:

用于编译 C++ 代码的 cl 标志是 /TP(对于 C 代码,/TC)。 根据 [MSDN 文档] (docs.microsoft.com/en-us/cpp/build/reference/…) /Tp 标志是指定一个包含 C++ 代码的源文件,而不考虑文件扩展名 难道没有任何选项可以将编译从预处理到编译,而无需从头开始? @Sisir 是的,我就是这么说的! @Sisir 不,没有

以上是关于如何使用 VS 编译器将预处理文件编译成目标文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将.cs文件编译成.exe可执行文件/ 我用vs2010命令提示编译.cs文件出现错误

linux+vs2013编译静态库和动态库

如何将 .cpp 源文件编译成 .dll?

C++源文件从文本到可执行文件经历的过程?

CMAKE怎么编译LAPACK

c语言是如何编译成二进制