在编译之前通过外部工具解析预处理源的任何方法?

时间:2011-05-23 15:32:31

标签: c++ visual-studio visual-c++ compiler-construction c-preprocessor

我希望编译器运行预处理,生成所有.i文件,就像我通常使用“生成预处理文件”选项一样,然后运行外部工具,等待它完成,然后继续编译那些.i文件(当然现在可以修改)。

如果那是不可能的,有没有办法在预处理和编译之前在每个正在编译的文件上运行外部工具? (在这样的环境中调试可能会很糟糕,但仍然如此)。

如果没有这样的选项,这甚至可以完成吗?我的意思是,编译器是否甚至使用那些.i文件,或者它们只是以某种方式为用户输出?

基本上,有没有办法在编译之前自动篡改源代码,但是没有修改实际的文件?

仅供参考:我试图想出一种聪明的方法来混淆所有字符串,只需对源进行最少的修改。

5 个答案:

答案 0 :(得分:4)

是的,您只需更新构建系统以进行预处理步骤,混淆步骤,然后编译到obj步骤。默认情况下,大多数构建系统仅将所有这些合并到一个步骤(并跳过混淆步骤)。对于像Scons,waf甚至Make这样的“真实”构建系统应该没什么大不了的。

如果您使用的是Visual Studio,则需要更多工作。微软希望你在MSBuild中编写你的构建操作,这是相当多的工作,恕我直言。这并不容易,因为MSVS主要是用于迭代开发的IDE,并不打算成为构建工具。它不是,也永远不会是一个构建工具(即使它碰巧做“构建东西”,但只是标准和非常简单的“构建东西”)。但是,您仍然可以使用具有不同构建工具的IDE。例如,我们使用Scons进行构建,它生成MSVS *.sln*.vcproj文件,这些文件仅使用Scons构建(但所有文件都在MSVS IDE中编辑)。

简单的答案:您的问题很简单,就是构建操作问题。对于任何非“玩具”构建系统,它应该是非常直接的。

distcc(分布式构建工具)在本地有效地预处理所有文件,然后将*.i发送到远程编译器(甚至不需要安装标头),然后发回*.obj。所以,你所谈论的内容非常简单。

答案 1 :(得分:3)

让x.cpp成为您要预处理的文件。

  1. 设置编译器选项以生成x.cpp的预处理输出,让它为x.i。
  2. 将x.i添加到项目中,并在属性中设置“自定义构建工具”。将“输出文件”设置为x.preprocessed.cpp。
  3. 将x.preprocessed.cpp添加到项目中。
  4. 有关详细信息,请参阅msdn

答案 2 :(得分:1)

您应该能够执行“预构建活动”并在那里插入任何外部工具。在VS200x中,它位于配置属性 - >构建事件 - >预建活动。

答案 3 :(得分:0)

只需使用体面的构建系统。如果您不喜欢这两个,请SConswaf或其他内容。

答案 4 :(得分:0)

您可以先使用make文件生成.i文件,对它们运行处理,然后编译它们。