12

我在 VS2010 C++ 中有一个非常庞大的解决方案,有几个项目,我只想保留那些实际需要的部分。

这很困难,因为一个项目的某些部分需要其他项目的其他部分。

有谁知道我如何自动删除运行应用程序时未调用的那些代码部分,也许使用 VS2010 左右的附加组件?

我想这是一个相当不寻常的愿望,但也许有人知道解决方案。

谢谢你。

4

3 回答 3

4

不是自动解决方案,但我使用 doxygen Graph 功能为项目类构建依赖关系树:doxygen doc on the subject

于 2013-04-17T15:44:37.640 回答
4

值得尝试一下链接选项,看看它们是否可以帮助您:链接器会丢弃它不使用的静态链接库中的代码。它必须准确地完成您想要的工作,即关闭所有使用过的东西并丢弃其余部分。我在 Visual Studio 2008 中进行了这项工作,以便从我正在维护的库中删除一些未使用的代码。

我在链接器命令行上使用了 /OPT:REF /VERBOSE,然后使用正则表达式在输出中搜索“Discarded .* from MYLIB.lib”。我刚刚在visual studio 2010中试过(我没有2012),和2008有点不同。我需要/OPT:REF /VERBOSE:REF,它似乎只能在调试下工作,因为大概是链接时优化正在阻碍(在发布时它说它正在丢弃使用的函数!)。无论如何,它值得更详细地研究,因为它确实在 2008 年下工作。我很想听听你是否有任何进展(你可能想先尝试一个简单的测试项目)。

编辑:我家​​里有visual studio 2012,所以试了一下。

使用 test.h 创建了一个静态库 testlib

void used();
void unused();

和 test.cpp

#include "test.h"
#include <stdio.h>

void used_by_used()
{
    printf("used_by_used");
}

void used()
{
    used_by_used();
    printf("used");
}

void used_by_unused()
{

    printf("used_by_unused!!!!");
}

void unused()
{
    used_by_unused();
    printf("unused!!!!");
}

和一个带有 cpp 文件的控制台应用程序

#include "../Win32Project1/test.h"

int _tmain(int argc, _TCHAR* argv[])
{
    used();
    return 0;
}

然后对于调试版本,在控制台应用程序的链接选项中将 References 设置为 Yes (/OPT:REF)。然后将“VERBOSE:REF”添加到命令行选项。在链接器输出中,您会得到很多垃圾

1>      Discarded "void __cdecl unused(void)" (?unused@@YAXXZ) from testlib.lib(test.obj)
1>      Discarded "void __cdecl used_by_unused(void)" (?used_by_unused@@YAXXZ) from testlib.lib(test.obj)

并且基于我对 Visual Studio 2008 所做的工作,希望这应该可以完成这项工作。(我现在看到你的问题实际上指定了 Visual Studio 2010。我猜这种技术将在 2008 年、2010 年和 2012 年工作,并进行了如上所述的修改。)

于 2013-04-17T16:19:41.027 回答
1

对于我的情况,我有一个很好的解决方案。我的解决方案包含大约 20 个项目,我可以卸载每个项目(使其显示为灰色)。如果我的代码仍然有效,我知道我可以将其删除。

于 2013-04-17T16:40:21.880 回答