忽略丢失的.obj文件或“/P开关+外部工具+链接器=地狱”

问题描述 投票:0回答:2

我正在尝试按照上一个问题中所述进行设置:在编译之前有什么方法可以通过外部工具解析预处理源吗?

我的所有 .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 文件吗? (无论如何,所有的符号都会被找到...)

c++ visual-studio-2008 c-preprocessor
2个回答
1
投票

也许这可以帮助您:而不是扩展名

.obfuscated.cpp
给它一个更简单的扩展,如
.icpp
并将这些
.icpp
文件(首次编译后)添加到您的项目(在项目中的单独文件夹中),然后每个
.icpp
文件都转到其属性页并设置正确的构建工具(C\C++ 编译器)和您的
.obj
文件保留与原始
.cpp
文件相同的名称部分,因此应自动正确完成链接。


0
投票

我也有类似的问题。 我只是想看到预处理的结果(没有额外的外部工具等)。
我以以下解决方案结束:

  • 我创建一个空的目标文件:只需将一个空源“dummy.cpp”添加到您的项目中即可。
    注意:dummy.cpp 必须为空,否则链接器会抱怨
    重复的符号。
  • 我将“*.icpp”源标记为“C++-Compiler”和/P 如上所述。
  • 我创建了一个 PreLink 操作,其中包含一个
    copy $(IntDir)dummy.obj $(IntDir)xyz.obj

    对于每个“xyz.icpp”源。
  • 如果你想要编译和预编译输出:
    为每个
    xyz-wrapper.cpp
    添加
    xyz.icpp

    包装器应该只包含一行,如下所示:
    #include "xyz.icpp"

现在链接器仍然搜索尚未创建的 xyz 对象,但我们给它空的虚拟对象。

注意:要在 VisualStudio 中获得

*.icpp
文件的语法高亮显示,您应该在 ->Tools->Options->TextEditor->FileExtensions

添加此扩展名
© www.soinside.com 2019 - 2024. All rights reserved.