Инструмент для отслеживания зависимостей #include
Есть хорошие предложения? На входе будет указано имя заголовочного файла, а на выходе должен быть список (предпочтительно дерево) всех файлов, включая его прямо или косвенно.
11 ответов
Если у вас есть доступ к GCC/G++, то -M
опция выведет список зависимостей. Он не выполняет никаких дополнительных действий, которые делают другие инструменты, но, поскольку он исходит от компилятора, нет никаких шансов, что он подберет файлы из "неправильного" места.
Спасибо Кейт Б. Я посмотрел документы для cl.exe (VS2008) и обнаружил флаг /showInclude. В среде IDE это можно установить на странице свойств любого файла CPP.
Для решения тяжелого веса, вы должны проверить Doxygen. Он просматривает вашу кодовую базу и эффективно создает веб-сайт, который документирует ваш код. Одна из многих вещей, которые это показывает, включает деревья.
Если вы хотели подключить выходные данные этого инструмента к какому-либо другому процессу, то это может не сработать для вас (хотя doxygen выводит данные в другие форматы, я не очень знаком с этой функцией). Если вы просто хотите взглянуть на зависимости, это должно работать отлично.
Я играл с инструментом под названием cinclude2dot. Это было довольно полезно, когда я пришел на работу, чтобы получить представление о довольно большой базе кода. Я на самом деле думал об интеграции его в нашу ежедневную сборку в конце концов.
Хорошие новости: redhat Source-Navigator (работает и на Windows). Конечно, переключатели компилятора (упомянутые ранее) имеют превосходный синтаксический анализ, и я не уверен, как это будет обрабатывать MFC, Qt и их магические ключевые слова.
Во-первых, 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, но и межпроектные зависимости общих файлов, влияние на время сборки, подробные свойства в сетках, отлично.
Основываясь на ответе 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.)
Вы также можете проверить makedepend:
Понимание для C++ должно быть в состоянии помочь вам: оно создает базу данных, к которой вы можете получить доступ из Perl.
cscope ( http://cscope.sourceforge.net/) делает это в автономном xterm, а также может использоваться в вашем любимом редакторе - он имеет отличную поддержку emacs и vi/vim.