2013-04-17 3 views
12

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

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

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

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

спасибо.

+0

Для VS2010 это потенциально новый вопрос, но [этот вопрос может помочь вам] (http://stackoverflow.com/questions/1413548/visual-studio-find-unused-code). –

+0

вы проверили 'VSInstr.exe' и' CodeCoverage.exe'? – perreal

ответ

4

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

4

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

и на основе того, что я сделал с Visual Studio 2008 это, мы надеемся, должны сделать эту работу. (Я вижу, теперь ваш вопрос на самом деле указан визуальной студией 2010. Я предполагаю, что этот метод будет работать в 2008, 2010 и 2012 годах с изменениями, как указано.)

1

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