Автоматическое обнаружение зависимостей C

StackOverflow https://stackoverflow.com/questions/204823

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это большой проект, и хотя у нас есть Makefile-файлы, которые теоретически содержат эту информацию, эти Makefile-файлы иногда неверны (мы унаследовали этот проект от другой компании).Нам часто приходилось делать make clean ; make чтобы наши изменения действительно были отражены при перекомпиляции, поэтому я не хочу полагаться на эти Make-файлы.

Итак, есть ли инструмент, который позволяет нам присвоить ему имя файла .c и включить путь и сообщить нам все файлы .h, которые прямо или косвенно включены в файл .c?У нас нет ничего странного, вроде

#define my_include "some_file.h"
#include my_include

таким образом, инструмент не обязательно должен быть совершенным.Все, что искало файлы .c и .h во включаемом пути для обычных включений, было бы достаточно хорошим.

Это было полезно?

Решение

Что я делаю в своем Makefile, так это

SRCS=$(wildcard *.c)

depend: $(SRCS)
    gcc -M $(CFLAGS) $(SRCS) >depend

include depend

Это означает, что при обновлении любого из исходных файлов будет запущено правило depend, которое использует gcc -M для обновления файла с именем depend.Затем это включается в makefile, чтобы предоставить правила зависимости для всех исходных файлов.

Make проверяет актуальность файла перед его включением, поэтому это правило depend будет выполняться при необходимости всякий раз, когда вы запускаете make без необходимости выполнять "make depend".

Это будет выполняться каждый раз, когда будет изменен какой-либо файл.Я никогда не считал это проблемой, но если у вас было огромное количество файлов в каталоге, вы могли бы обнаружить, что это заняло слишком много времени, и в этом случае вы могли бы попробовать использовать один файл зависимостей для каждого исходного файла, например, так:

SRCS=$(wildcard *.c)
DEPS=$(SRCS:.c=.dep)

%.dep : %.c
    gcc -M $(CFLAGS) $< >$@

include $(DEPS)

Обратите внимание, что вы можете использовать -MM вместо -M, чтобы не включать системные заголовки.

Другие советы

"gcc -M file.c" делает то, что вам нужно.

Альтернативой gcc -M является быстрый переход.Автор Fastdep сообщает, что fastdep в десять раз быстрее, чем gcc -M.Если сборка проекта займет некоторое время, возможно, стоит обратить внимание на fastdep.

Используйте лепешки

$ scons --tree=all
scons: Reading SConscript files ...

scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
+-.
  +-SConstruct
  +-app
  | +-test.o
  | | +-test.c
  | | +-/include/PCI_1149_1.h
  | | +-/include/Pci.h
  | | +-/usr/bin/gcc
  | +-/usr/bin/gcc
  | +-/lib/libpci1149_64.a
  ...

В MSVC (по крайней мере, 2005 и 2008, возможно, и в других версиях, но не в VC6) вы можете заставить компилятор сообщить вам все файлы, которые были включены во время компиляции.Выходные данные довольно подробные, но полные, и их довольно легко разобрать человеческими глазами.

В настройках проекта перейдите на вкладку C / C ++> Дополнительно и переключите "Показать включает", затем перестройте свой проект с нуля.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top