С++ найти необходимые части кода

У меня есть действительно огромное решение в VS2010 С++ с несколькими проектами, и я хочу только сохранить те части, которые действительно нужны.

Это сложно, потому что некоторые части одного проекта нуждаются в других частях других проектов.

Кто-нибудь знает, как я могу автоматически удалить те части кода, которые не вызываются при запуске приложения, возможно, используя надстройку для VS2010 или так?

Я думаю, это довольно необычное желание, но, возможно, кто-то знает решение в любом случае.

Спасибо.

Ответ 1

Не автоматическое решение, но я использовал функцию Doxygen Graph для построения дерева зависимостей для класса проекта: Doxygen doc по теме

Ответ 2

Вам стоит поиграть со ссылками, чтобы узнать, могут ли они вам помочь: компоновщик удаляет код в статически связанных библиотеках, которые он не использует. Он должен выполнять именно ту работу, которую вы хотите, т.е. Закрывать все, что используется, и отбрасывать остальное. Я получил эту работу в 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 годах с внесенными изменениями.)

Ответ 3

У меня - для моей ситуации - неплохое решение. Мое решение содержит около 20 проектов, и я могу выгрузить каждый проект (чтобы он выглядел серым). Если мой код все еще работает, я знаю, что могу его удалить.