为啥 Visual C++ 编译器将未使用的类编译成可执行文件?

Posted

技术标签:

【中文标题】为啥 Visual C++ 编译器将未使用的类编译成可执行文件?【英文标题】:Why Visual C++ compiler compiles unused classes into executable?为什么 Visual C++ 编译器将未使用的类编译成可执行文件? 【发布时间】:2014-09-04 09:01:13 【问题描述】:

我可能误解了编译器的工作原理,但我有以下情况。我有一个 VC++ 2012 项目。该项目包含一个包含数百个类的 API。现在,我创建了“主”入口点文件,我只使用了一些标准的东西。主要不包括来自 API 的单个标头。但是当我编译时,我看到 API 中的所有内容都被编译到可执行文件中?为什么会发生这种情况?我应该在项目中配置吗特性?

【问题讨论】:

如果这些文件是项目的一部分,它们也会被编译 有没有办法防止这种情况发生? 如果要优化,请让编译器优化 没有详细信息,很难确切地说出发生了什么。尝试为我们缩小范围。 【参考方案1】:

作为项目一部分的源文件如果“未使用”,也会通过主例程中的标头和引用进行编译。

如果您不想编译这些,只需将它们从项目中删除即可。编译器可能能够优化所有内容,但这并不意味着如果首先是项目的一部分,它们就不会被编译。

【讨论】:

但我说过,主文件中没有这些文件的引用/标题。 没关系,它们是项目的源文件的一部分,它们也被编译。如果您不使用它们,为什么首先要在项目中使用它们?您是否要导出这些符号? 正如 Marco A. 所说:如果您在 Project Explorer 中链接了 *.cpp 文件,它将被编译。另一种解决方案可以是右键单击/属性检查 PE 中特定文件的“排除”属性

以上是关于为啥 Visual C++ 编译器将未使用的类编译成可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

为啥在 Visual Studio 中编译 C++ 项目时出现致命错误“LNK1104:无法打开文件 'cryptlib.lib'?

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

在 Visual Studio 中通过 C# 类编译 C++ 代码

为啥我不能在 Visual Studio 中禁用预编译头文件?

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?