我正在尝试按照上一个问题中所述进行设置:在编译之前有什么方法可以通过外部工具解析预处理源吗?
我的所有 .cpp 文件都设置为使用 /p 进行编译,这会为所有文件生成 .i(预处理)文件,但没有目标文件。这些生成的 .i 文件也会添加到我的项目中,并且为我的工具设置了一个外部构建工具选项,用于修改这些文件,并将它们保存在新扩展名 .obfuscated.cpp 下 所有这些 .obfuscated.cpp 文件也会添加到项目中,并设置为正常编译,生成目标文件。
现在的问题是,Visual Studio(或链接器,其中的某个人)出于某种原因想要来自 .cpp 文件(现在仅保存到 .i 文件,没有生成目标文件)和 .obfuscated 的 obj 文件.cpp(正常创建的)。
我假设链接器不需要来自设置为使用 /P 选项进行编译的源的 .obj 文件,因为该选项会阻止创建目标文件。
现在我只看到两种方法来解决这个问题: 1)分两步进行构建。在第一个中,确保所有 .cpp 文件都经过预处理并保存到 .i 文件中。此构建不必完成,只需保存 .i 文件即可。然后,我选择所有 .cpp 文件并将它们设置为“从构建中排除”,然后一切都会按预期进行编译。 2)不要将文件添加到项目并使用外部构建工具选项,而是进行预链接步骤,其中我自己的工具将自动查找所有 .i 文件(可以获取某个目录中的所有 *.i ),将它们处理为 *.obfuscated.cpp,然后在所有这些文件上手动调用 cl.exe 以生成目标文件,将它们重命名为正确的名称(以便链接器认为它们是从原始源创建的目标文件)并放入进入中间目录。但在这种情况下,我必须跟踪所有编译器参数,并在我的项目发生变化时相应地更改它们...... 这两种解决方案看起来都不是很漂亮。在 Visual Studio 中还有其他方法可以做到这一点吗?我不能告诉链接器忽略丢失的 .obj 文件吗? (无论如何,所有的符号都会被找到...)
也许这可以帮助您:而不是扩展名
.obfuscated.cpp
给它一个更简单的扩展,如 .icpp
并将这些 .icpp
文件(首次编译后)添加到您的项目(在项目中的单独文件夹中),然后每个 .icpp
文件都转到其属性页并设置正确的构建工具(C\C++ 编译器)和您的.obj
文件保留与原始 .cpp
文件相同的名称部分,因此应自动正确完成链接。
我也有类似的问题。
我只是想看到预处理的结果(没有额外的外部工具等)。
我以以下解决方案结束:
copy $(IntDir)dummy.obj $(IntDir)xyz.obj
xyz-wrapper.cpp
添加 xyz.icpp
。#include "xyz.icpp"
现在链接器仍然搜索尚未创建的 xyz 对象,但我们给它空的虚拟对象。
注意:要在 VisualStudio 中获得
*.icpp
文件的语法高亮显示,您应该在 ->Tools->Options->TextEditor->FileExtensions 添加此扩展名