我在VS2010 C ++中有一个非常庞大的解决方案,有几个项目,我只想保留那些实际需要的部分。
这很困难,因为一个项目的某些部分需要其他项目的其他部分。
有没有人知道如何在运行应用程序时自动删除那些未调用的代码部分,也许是使用VS2010的附加组件?
我想这是一个相当不寻常的愿望,但也许有人知道解决方案。
谢谢。
答案 0 :(得分:4)
不是自动解决方案,但我使用doxygen Graph功能为项目类构建依赖关系树:doxygen doc on the subject
答案 1 :(得分:4)
值得使用链接选项来查看它们是否可以帮助您:链接器丢弃它不使用的静态链接库中的代码。它必须完成你想要的工作,即关闭所有使用的东西并丢弃其余部分。我在visual studio 2008中使用它,以便从我正在维护的库中删除一些未使用的代码。
我在链接器命令行上使用了/ OPT:REF / VERBOSE,然后使用正则表达式在输出中搜索“Discarded。* from MYLIB.lib”。我刚刚在visual studio 2010中尝试过它(我没有2012),它与2008年有点不同。我需要/ OPT:REF / VERBOSE:REF,它似乎只能在调试下工作,因为大概是链接时优化正在阻碍(在发布时它表示它正在丢弃已使用的函数!)。无论如何,它值得更详细地研究,因为它确实在2008年之前工作。我很想知道你是否到了任何地方(你可能想先尝试一个简单的测试项目)。
编辑:我在家里有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;
}
然后,对于调试版本,在控制台应用程序的链接选项中将引用引用为是(/ 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年进行修改,如上所述。)
答案 2 :(得分:1)
对于我的情况,我有一个非常好的解决方案。 我的解决方案包含大约20个项目,我可以卸载每个项目(因此它看起来是灰色的)。如果我的代码仍然有效,我知道我可以保存删除它。