我在 VS2010 C++ 中有一个非常庞大的解决方案,有几个项目,我只想保留那些实际需要的部分。
这很困难,因为一个项目的某些部分需要其他项目的其他部分。
有谁知道我如何自动删除运行应用程序时未调用的那些代码部分,也许使用 VS2010 左右的附加组件?
我想这是一个相当不寻常的愿望,但也许有人知道解决方案。
谢谢你。
我在 VS2010 C++ 中有一个非常庞大的解决方案,有几个项目,我只想保留那些实际需要的部分。
这很困难,因为一个项目的某些部分需要其他项目的其他部分。
有谁知道我如何自动删除运行应用程序时未调用的那些代码部分,也许使用 VS2010 左右的附加组件?
我想这是一个相当不寻常的愿望,但也许有人知道解决方案。
谢谢你。
不是自动解决方案,但我使用 doxygen Graph 功能为项目类构建依赖关系树:doxygen doc on the subject
值得尝试一下链接选项,看看它们是否可以帮助您:链接器会丢弃它不使用的静态链接库中的代码。它必须准确地完成您想要的工作,即关闭所有使用过的东西并丢弃其余部分。我在 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 年工作,并进行了如上所述的修改。)
对于我的情况,我有一个很好的解决方案。我的解决方案包含大约 20 个项目,我可以卸载每个项目(使其显示为灰色)。如果我的代码仍然有效,我知道我可以将其删除。