Інструмент для відстеження # включення залежностей [закрито]


175

Будь-які хороші пропозиції? Вхідним буде ім'я файлу заголовка, а вихідний - список (бажано дерево) усіх файлів, включаючи його безпосередньо чи опосередковано.


4
Справа не в тому, що "улюблені" включення відображаються непогано в gcc, але msvs - ні. Тож ми (я) шукаємо будь-який інструмент.
фантастика

70
Чому я продовжую вважати "поза темою" питання настільки корисними?
jfritz42

5
@ jfritz42: Цьому слід присудити нагороду "Коментар року"! Як один модератор може позначити питання "поза темою", коли існує стільки тем і стільки користувачів?
Тоторо

2
Я хотів би зазначити, що існує набагато більше інструментів для боротьби з #includeзалежностями, такими як cpp-залежності , iwyu та dep-matrix, який є досить наївним інструментом, написаним на python.
безчувальна

3
@ jfritz42 Цифри чіткі: 123 голоси та 62 фаворити. Багато людей бачать це таким чином. Дивні стандарти SO. Я також сумніваюся, що такі запитання матимуть однакові чудові відповіді щодо SuperUser.
Андреас

Відповіді:


148

Якщо у вас є доступ до GCC / G ++, тоді -Mпараметр виводить список залежностей. Він не робить жодного із зайвих матеріалів, які роблять інші інструменти, але оскільки він надходить від компілятора, немає шансів, що він підбере файли з "неправильного" місця.


60
-Hнавіть дерево дає!
СамБ

28
-MMпропускає заголовки системи
TheJosh

3
Також з -oможливістю компілятор запише висновок у файл замість stdout.
Привіт-Ангел

2
@SamB Це працює лише в тому випадку, якщо помилок немає і друкується на, stderrа не stdout. Інакше цей варіант більш загальний.
користувач877329

92

Завдяки KeithB. Я переглянув документи для cl.exe (VS2008) і знайшов прапор / showIncludes. З IDE це можна встановити на сторінці властивостей будь-якого файлу CPP.

Екран постріл


1
Це надзвичайно корисно для вирішення деяких дуже складних помилок компіляції / попереджень. Дуже дякую!
Ешвін Нанджаппа

Це також дуже зручно при спробі оптимізації попередньо складених заголовків!
fmuecke

Під час роботи в VS, я думаю, що це найшвидше рішення для вирішення моєї проблеми ~ :-)
yaobin

Це, здається, не спрацює, якщо якийсь заголовок містить заголовок std c, наприкладmath.h
abergmeier

29

Для важкого розчину слід перевірити доксиген . Він перевіряє вашу кодову базу і ефективно розробляє веб-сайт, який документує ваш код. Одне з багатьох речей, які він показує, - це дерева.

Якщо ви шукали можливість увімкнути вихід цього інструменту в якийсь інший процес, то це може не працювати для вас (хоча доксиген робить вихід у інші формати, я не реально знайомий з цією функцією). Якщо ви просто хочете заглянути в залежності, залежно від цього, це має спрацювати чудово.


20

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


2
Цей засіб працює виключно добре. У мене були проблеми з -М та доксигеном g ++.
сонник

Я написав сценарій python, щоб прочитати вихід cinclude2dot і отримати всю залежність на карті, а потім зробити першу глибину обходу, щоб нарешті вивести ліс джерел. Ліс, у якому немає жодного .cc/.c/.cxxфайлу (лише .hфайли в ньому), може бути зайвим.
шува

12

По-перше, cinclude2dot.pl - це сценарій perl, який аналізує код C / C ++ та створює графік залежності #include як крапковий файл для введення в graphviz.

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

Якщо ви не хочете йти шляхом такого ручного інструменту, то, на мою думку, переможець далекого переможця - це інструмент, відомий як ProFactor як "IncludeManager".

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

Існує безкоштовна пробна версія, і це приголомшливо. Це плагін для Visual Studio, який повністю інтегрований, тому подвійне клацання на щось тут перенесе вас на місце, де воно там включено.

Наведення курсорів миші дає вам всю інформацію, яку ви хотіли, і це дозволяє вам прокручувати вниз / вгору, видаляти цілі підряди, які вам не цікаві, переглядати представлення, крім графіків, переглядати список відповідностей для цього і того, це чудово.

Якщо ви швидко зробите це, ви можете відновити структуру #include великих проектів до закінчення пробного періоду. Тим не менш, це не коштує багато, близько 35 доларів за ліцензію.

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


Я успішно використовував IncludeManager у своєму проекті C. Я використовую Visual Studio 2013.
smwikipedia

Якийсь підозрілий.
sdd

12

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

redhat Source-Навігатор


5

Спираючись на відповідь KeithB , ось GNUmake синтаксис автоматично 1) генерує файли залежностей, 2) оновлює їх та 3) використовує їх у вашому makefile:

.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)

(Не забудьте змінити ці відступи на тверді вкладки.)



3

Розуміння C ++ повинно вам допомогти: вона створює базу даних, до якої можна отримати доступ з Perl.


Зрозуміти, це комерційно, але це неймовірний ІМО. Ви можете спробувати його безкоштовно.
skelliam

1

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.