Как визуализировать статические зависимости в С++ коде?

Есть большой проект на С++ под Visual Studio. Хочется визуализировать зависимости между его сущностями, чтобы лучше понять структуру проекта. Первое, что приходит на ум - граф зависимостей классов. Каким образом его построить?

Рассмотрим следующий пример кода:
class Used {
public:
  void bar();
};

class Base { };

class Derived : public Base {
public:
  void foo(Used*);  // Dependency on class Used
};

Хочется получить что-то типа такого:
1W11K.png

Пробовал следующее.

1. CppDepend. Умеет делать в точности то, что нужно, но по каким-то причинам глючит на больших проектах: не видит некоторых зависимостей. Никаких ошибок при анализе не выдёт, так что понять, что именно его смущает, на таком большом проекте затруднительно. Плюс все зависимости показаны одним и тем же типом стрелок. Писал разработчикам, давно обещают выкатить 5-ю версию, но всё никак не могут, поправили только несколько небольших багов в 4-й версии. Картинка для примера:
27b86b052b3647f59f83a7f489149afa.png

2. doxygen. Умеет строить collaboration graph для классов. Показывает зависимости, но вот беда: за зависимости считает только наследование и аггрегацию. Задавал по этому поводу вопрос на stackoverflow, безуспешно. Картинка в начале, "что хочется", получена как раз с помощью doxygen, если foo объявить как поле типа Used, а не как метод с аргументом Used. Реальная картинка для примера выглядит так:
7ieSf.png

3. Visual Studio 2013 Ultimate. Опция Architecture -> Generate dependency graph -> For solution строит то, что нужно. Но оно вообще не работает для зависимостей между разными проектами! Капец. И стрелки тоже все одного вида:
f1e9d116f8aa4e4fa00cf0e58fc0210b.png

Интересуют предложения, как построить такой граф зависимостей между классами, а также иные способы визуализации статических зависимостей в С++ коде.
  • Вопрос задан
  • 3215 просмотров
Решения вопроса 1
ManWithBear
@ManWithBear
Swift Adept, Prague
Enterprise Architect
Умеет строить графы по коду
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы