Инструмент для отслеживания зависимостей #include [закрыто]

175

Есть хорошие предложения? На входе будет указано имя заголовочного файла, а на выходе должен быть список (предпочтительно дерево) всех файлов, включая его прямо или косвенно.

Агнель Курьян
источник
4
Речь идет не о «любимых» включениях, которые красиво отображаются в gcc, а в msvs нет. Поэтому мы (я) ищем любой инструмент.
фантастика
70
Почему я продолжаю находить "не по теме" вопросы такими полезными?
jfritz42
5
@ jfritz42: Это должно быть удостоено награды «Комментарий года»! Как один модератор может пометить вопрос как "не по теме", когда существует так много тем и так много пользователей?
Тоторо
2
Я хотел бы отметить, что существует гораздо больше инструментов для работы с #includeзависимостями, таких как cpp-dependencies , iwyu и dep -matrix, который является довольно наивным инструментом, написанным на python.
nonsensickle
3
@ jfritz42 Цифры понятны: 123 голоса и 62 избранных. Многие люди видят это таким образом. Странные ТАК стандарты. Я также сомневаюсь, что такие вопросы будут иметь такие же хорошие ответы на SuperUser.
Андреас

Ответы:

148

Если у вас есть доступ к GCC / G ++, то -Mопция выведет список зависимостей. Он не выполняет никаких дополнительных действий, которые делают другие инструменты, но, поскольку он исходит от компилятора, нет никаких шансов, что он подберет файлы из «неправильного» места.

KeithB
источник
60
-Hдаже дерево дарит!
SamB
28
-MMпропускает системные заголовки
TheJosh
3
Также с -oопцией компилятор будет записывать вывод в файл вместо stdout.
Привет-ангел
2
@SamB Это работает, только если нет ошибок, и печатает stderrвместо stdout. В противном случае этот вариант является более общим.
user877329
92

Спасибо Кейт Б. Я посмотрел документы для cl.exe (VS2008) и обнаружил флаг / showInclude. В IDE это можно установить на странице свойств любого файла CPP.

Скриншот

Агнель Курьян
источник
1
Это чрезвычайно полезно для решения некоторых очень сложных ошибок / предупреждений компиляции. Большое спасибо!
Эшвин Нанджаппа
Это также очень удобно при оптимизации предварительно скомпилированных заголовков!
fmuecke
Работая в VS, я думаю, что это самое быстрое решение моей проблемы ~ :-)
yaobin
Это, похоже, не работает, если какой-то заголовок содержит заголовок std c, напримерmath.h
abergmeier
29

Для решения тяжелого веса, вы должны проверить Doxygen . Он сканирует вашу кодовую базу и эффективно создает веб-сайт, который документирует ваш код. Одна из многих вещей, которые он показывает, включает деревья.

Если вы хотели подключить вывод этого инструмента к другому процессу, то это может не сработать для вас (хотя doxygen выводит в другие форматы, я не очень знаком с этой функцией). Если вы просто хотите взглянуть на зависимости, это должно работать отлично.

Мэтт Диллард
источник
20

Я играл с инструментом под названием cinclude2dot . Это было довольно полезно, когда я пришел на работу, чтобы получить представление о довольно большой кодовой базе. Я на самом деле думал об интеграции его в нашу ежедневную сборку в конце концов.

Брайан Стюарт
источник
2
Этот инструмент работает исключительно хорошо. У меня были проблемы с g ++ -M и doxygen.
сонник
Я написал скрипт на python для чтения выходных данных cinclude2dot и получения всех зависимостей на карте, а затем сделал обход в глубину, чтобы в итоге вывести лес источников. Лес, в котором нет ни одного .cc/.c/.cxxфайла (только .hфайлы в нем), может быть избыточным.
Шува
12

Во-первых, cinclude2dot.pl - это скрипт на perl, который анализирует код C / C ++ и создает граф зависимостей #include в виде файла точек для ввода в graphviz.

http://www.flourish.org/cinclude2dot/

Если вы не хотите идти по пути ручного инструмента такого рода, то, на мой взгляд, победитель на практике является инструментом, называемым «IncludeManager» от ProFactor.

http://www.profactor.co.uk/includemanager.php

Есть бесплатная пробная версия, и это здорово. Это плагин для Visual Studio, который полностью интегрирован, поэтому двойной щелчок мышью по чему-то здесь приведет вас к тому месту, где он включен.

Мышки подсказок дают вам всю информацию, которую вы хотели бы, и она позволяет вам детализировать / удалять, удалять целые поддеревья, которые вам не нужны, просматривать представления, отличные от графиков, циклически просматривать список совпадений для этого и того, это замечательно.

Если вы быстро это сделаете, вы можете провести рефакторинг структуры #include больших проектов до окончания пробной версии. Несмотря на это, это стоит недорого, около 35 долларов за лицензию.

Для того, что он делает, он просто идеален. Не только графы #include, но и межпроектные зависимости общих файлов, влияние на время сборки, подробные свойства в сетках, отлично.

Allbite
источник
Я успешно использовал IncludeManager в моем C-проекте. Я использую Visual Studio 2013.
smwikipedia
Вроде подозрительно.
SDD
12

Хорошая новость: redhat Source-Navigator (работает и на Windows). Конечно, переключатели компилятора (упомянутые ранее) имеют превосходный синтаксический анализ, и я не уверен, как это будет обрабатывать MFC, Qt и их магические ключевые слова.

Редхат Источник-Навигатор

Агнель Курьян
источник
5

Основываясь на ответе KeithB , вот синтаксис GNUmake для автоматической 1) генерации файлов зависимостей, 2) их обновления и 3) использования их в вашем make-файле:

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

(Обязательно поменяйте эти отступы на hardtabs.)

CXW
источник
3

Понимание для C ++ должно быть в состоянии помочь вам: он создает базу данных, к которой вы можете получить доступ из Perl.

Ксавье Ноде
источник
Поймите, это коммерческое, но это невероятное ИМО. Вы можете попробовать это бесплатно.
Skelliam
1

cscope ( http://cscope.sourceforge.net/ ) делает это в автономном xterm, а также может использоваться в вашем любимом редакторе - он имеет отличную поддержку emacs и vi / vim.

SVEC
источник