0

我有一个使用 MS-Visual Studio 2005 和所有 C 代码构建的工作区。在其中我看到许多未调用但它们仍被编译的函数(它们不在任何编译时宏下以禁用它们编译)。

我为 MS-VS2005 项目设置了以下优化设置以删除未使用的代码:-

优化级别 - /Ox

启用整个程序优化 - /GL

我尝试了 Favor speed /Ot 和 Favor Size /Os

尽管有所有这些选项,当我看到链接器生成的映射文件时,我看到了映射文件中存在的符号(unsed 函数)名称。

我错过了什么吗?我想完全删除未使用的代码。

我该怎么做呢?

4

2 回答 2

2

编译器一次编译一个 C 文件。因此,在编译包含未使用函数的 C 文件时,编译器无法确定不会从另一个文件调用它,因此它也会编译该函数。但是,如果该函数被声明为静态(文件范围),那么编译器会知道它没有被使用并因此删除它。

即使对整个程序进行了优化,我认为它仍然不会完成,因为编译可能是针对库的。

链接器执行与您正在寻找的类似的事情。如果您的代码链接到包含多个对象的库,则任何不包含您的代码(直接或间接)使用的函数的对象都不会包含在最终的可执行文件中。

一种选择是将您的代码分成单独的库和目标文件。

PS - 这只是我的猜测。编译器(具有整个程序优化)或链接器的行为本质上取决于该特定编译器或链接器的设计选择

于 2009-10-14T16:00:15.977 回答
0

在我们的项目中,我们在项目属性\链接器\参考下设置了一个标志。我们将其设置为 Eliminate Unreferenced Data (/OPT:REF),根据描述,这应该删除从未使用过的函数调用或数据。我只是按照描述进行,我从未测试过或使用过它。但我只是碰巧在最后一个小时内看到了它,并认为这可能是你可以尝试的。

于 2009-10-14T19:00:04.990 回答