c++ - 有没有办法比较 Visual Studio 中的 obj 文件?

标签 c++ visual-studio build

我有一个 C++ 项目,它构建了多种配置(不仅仅是调试/发布),而且它是一个相当庞大的项目。我们称它为 KitchenSink.vcproj

我怀疑无论配置如何,这个项目的许多部分都是相同构建的。例如。对于不使用字符串的源文件,使用/不使用 Unicode 支持构建无关紧要。

这将导致同一个源文件在多个配置中被编译,但生成(有效地)同一个 .obj 文件。它不会生成相同的文件,因为时间戳等嵌入在文件中,但目标文件的所有功能部分都是相同的。

有没有办法检查这个?我想将 KitchenSink 的片段提取到他们自己的更简单的项目中,只需要构建一次。这将加快构建时间,并简化我们的代码库。但是我需要一种方法来自动查找构建相同代码的部分,而不管配置如何。有没有简单的方法可以做到这一点?

编辑: 澄清我的观点。想象一下以下文件:

// Some header file
int calculate_something(int a, int b);

// The source file
int calculate_something(int a, int b) {
    return a * b;
}

现在,该源文件与 Unicode 无关。因此,如果我们在 Unicode 配置中构建它,然后使用 MultiByte 配置再次构建它,我们只是在浪费时间。我们可以把它放到它自己的静态库中,它是在没有 Unicode 支持的情况下构建的,然后这个新库可以被我的其他项目使用。这没有任何风险。

我只需要找到这些可以安全地移动到单独项目的文件。

编辑:进一步说明:

KitchenSink.vcproj has the following files (among others)
    StringUtils.h
    StringUtils.cpp
    MathStuff.h
    MathStuff.cpp

现在,如果您在 Unicode 中构建 KitchenSink,然后在 MultiByte 中再次构建,您将构建两次 StringUtils.obj 和两次 MathStuff.obj。显然,这对于 StringUtils.obj 是必需的,因为它在 Unicode 和 MultiByte 中会有所不同。但是 MathStuff.obj 应该构建完全相同的。

所以,我想重新安排/重组/重构如下:

KitchenSink.vcproj has the following files (among others)
    StringUtils.h
    StringUtils.cpp

NewProject.vcproj has the following files
    MathStuff.h
    MathStuff.cpp

现在,KitchenSink 可以在其多种配置中构建,而 NewProject 只需一个调试/发布选项即可构建。

再次声明,我不是在谈论共享 obj 文件。我说的是从一个项目中删除 cpp/h 文件,然后将它们放入另一个项目中。

另请注意,Unicode/Multibyte 是具有多个配置的项目示例。我的项目中的实际情况实际上更复杂,因此每个源文件都编译了 4 次,而不是 Unicode/Multibyte 会出现的 2 次。

最佳答案

在 linux 和 Cygwin/MINGW 上,ccache 对此有帮助(检测具有相同编译标志的相同预处理源)。 SCons(使用 python 的 make 替换)可以做同样的事情。

对于 Visual Studio,恐怕您会查看 IncrediBuild

也就是说,这个答案列出了对其他候选人(正在进行的项目)的一些引用: Is there a Ccache for Visual Studio?

关于c++ - 有没有办法比较 Visual Studio 中的 obj 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895652/

相关文章:

ios - Xcode 12 和 iOS 15

java - 在 Ubuntu 中构建 Red5 应用程序失败

c++ - 在 C++ 中使用 IFileDialog 以编程方式预选择

c++ - 大整数和 double 之间的乘法

c++ - 匿名命名空间在这里导致 undefined reference - 在那里工作

c++ - 在 Windows 上用 C++ 计算 CPU 时间

c - 在 Visual Studio 中将项目与 ntdll.dll 链接

visual-studio - 为什么 Visual Studio 2019 在 'Visual Studio Emulator for Android' 启动后不显示模拟器?

c++ - 无法执行 fstream >> int * 吗?

java - maven如何设置为不需要 `mvn`命令的目标?