Ответ 1
Не автоматическое решение, но я использовал функцию Doxygen Graph для построения дерева зависимостей для класса проекта: Doxygen doc по теме
У меня есть действительно огромное решение в VS2010 С++ с несколькими проектами, и я хочу только сохранить те части, которые действительно нужны.
Это сложно, потому что некоторые части одного проекта нуждаются в других частях других проектов.
Кто-нибудь знает, как я могу автоматически удалить те части кода, которые не вызываются при запуске приложения, возможно, используя надстройку для VS2010 или так?
Я думаю, это довольно необычное желание, но, возможно, кто-то знает решение в любом случае.
Спасибо.
Не автоматическое решение, но я использовал функцию Doxygen Graph для построения дерева зависимостей для класса проекта: Doxygen doc по теме
Вам стоит поиграть со ссылками, чтобы узнать, могут ли они вам помочь: компоновщик удаляет код в статически связанных библиотеках, которые он не использует. Он должен выполнять именно ту работу, которую вы хотите, т.е. Закрывать все, что используется, и отбрасывать остальное. Я получил эту работу в visual studio 2008, чтобы удалить неиспользуемый код из библиотеки, которую я поддерживал.
Я использовал /OPT: REF/VERBOSE в командной строке компоновщика, а затем обыскал вывод для "Отброшен. * из MYLIB.lib" с использованием регулярного выражения. Я попробовал это на визуальной студии 2010 только сейчас (у меня нет 2012), и это немного отличалось от 2008 года. Мне нужно /OPT: REF/VERBOSE: REF, и это только казалось, работало под отладкой, потому что предположительно оптимизация ссылок-ссылок мешает (при выпуске он сказал, что отбрасывает функции, которые были использованы!). В любом случае, стоит заглянуть в более подробно, потому что это работало в 2008 году. Мне было бы интересно услышать, если вы где-нибудь (вы можете попробовать простой, тестовый проект в первую очередь).
EDIT: У меня есть visual studio 2012 дома, поэтому попробовал.
Создал статическую библиотеку testlib с тегом test.h
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)" ([email protected]@YAXXZ) from testlib.lib(test.obj)
1> Discarded "void __cdecl used_by_unused(void)" ([email protected]@YAXXZ) from testlib.lib(test.obj)
и, основываясь на том, что я сделал с визуальной студией 2008, это, надеюсь, должно выполнить эту работу. (Теперь я вижу, что ваш вопрос на самом деле был указан visual studio 2010. Я предполагаю, что этот метод будет работать в 2008, 2010 и 2012 годах с внесенными изменениями.)
У меня - для моей ситуации - неплохое решение. Мое решение содержит около 20 проектов, и я могу выгрузить каждый проект (чтобы он выглядел серым). Если мой код все еще работает, я знаю, что могу его удалить.