我正在尝试按照上一个问题中所述进行设置:Any way to parse preprocessed source through external tool before it compiles?
我的所有.cpp文件都设置为使用/ p编译,它为所有文件生成.i(预处理)文件,但没有目标文件。那些生成的.i文件也被添加到我的项目中,外部构建工具选项设置为我的工具,修改这些文件,并将它们保存在新的扩展名下.obfuscated.cpp 所有这些.obfuscated.cpp文件也会添加到项目中,并设置为正常编译,生成目标文件。
现在的问题是,Visual Studio(或链接器,他们中的某些人)出于某种原因想要从.cpp文件(现在只保存到.i文件,没有生成目标文件)的obj文件,以及.obfuscated.cpp(正常创建)。
我认为链接器不需要来自设置为使用/ P选项编译的源的.obj文件,因为这个选项可以防止创建目标文件。
现在我只看到两种解决方法: 1)分两步完成构建。在第一个中,确保所有.cpp文件都已预处理并保存到.i文件中。这个构建不必完成,只需要保存.i文件。然后,我选择所有的.cpp文件并将它们设置为“从构建中排除”,然后一切都按照它应该编译。 2)而不是将文件添加到项目并使用外部构建工具选项,而是进行预链接步骤,其中我自己的工具将自动查找所有.i文件(可以在某个目录中获取所有* .i ),将它们处理到* .obfuscated.cpp,然后手动调用所有这些文件上的cl.exe来生成目标文件,将它们重命名为正确的名称(以便链接器认为它们是从原始源创建的目标文件)并放入进入中间目录。但在这种情况下,我必须跟踪所有编译器参数并相应地更改它们,如果我的项目中的某些更改... 这两种解决方案看起来都不是很好。在Visual Studio中是否还有其他方法可以执行此操作?我不能告诉链接器忽略丢失的.obj文件吗? (无论如何都会找到所有的符号......)
答案 0 :(得分:1)
也许这可以帮到你:而不是扩展名.obfuscated.cpp
给它一个更简单的扩展名,如.icpp
,并将这些.icpp
文件(在第一次编译后)添加到你的项目中(在一个单独的项目中的文件夹),然后为每个.icpp
文件转到其属性页面并设置正确的构建工具(C \ C ++编译器),并且您的.obj
文件保留相同的名称 - 部分原始.cpp
文件,因此链接应自动正确完成。