Есть большой проект на С++ под Visual Studio. Хочется визуализировать зависимости между его сущностями, чтобы лучше понять структуру проекта. Первое, что приходит на ум - граф зависимостей классов. Каким образом его построить?
Рассмотрим следующий пример кода:
class Used {
public:
void bar();
};
class Base { };
class Derived : public Base {
public:
void foo(Used*); // Dependency on class Used
};
Хочется получить что-то типа такого:
Пробовал следующее.
1.
CppDepend. Умеет делать в точности то, что нужно, но по каким-то причинам
глючит на больших проектах: не видит некоторых зависимостей. Никаких ошибок при анализе не выдёт, так что понять, что именно его смущает, на таком большом проекте затруднительно. Плюс все зависимости показаны одним и тем же типом стрелок. Писал разработчикам, давно обещают выкатить 5-ю версию, но всё никак не могут, поправили только несколько небольших багов в 4-й версии. Картинка для примера:
2.
doxygen. Умеет строить collaboration graph для классов. Показывает зависимости, но вот беда:
за зависимости считает только наследование и аггрегацию. Задавал по этому поводу
вопрос на stackoverflow, безуспешно. Картинка в начале, "что хочется", получена как раз с помощью doxygen, если foo объявить как поле типа Used, а не как метод с аргументом Used. Реальная картинка для примера выглядит так:
3.
Visual Studio 2013 Ultimate. Опция Architecture -> Generate dependency graph -> For solution строит то, что нужно. Но оно вообще
не работает для зависимостей между разными проектами! Капец. И стрелки тоже все одного вида:
Интересуют предложения, как построить такой граф зависимостей между классами, а также иные способы визуализации статических зависимостей в С++ коде.