Автоматическое обнаружение зависимостей C - PullRequest
11 голосов
/ 15 октября 2008

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

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

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

#define my_include "some_file.h"
#include my_include

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

Ответы [ 5 ]

14 голосов
/ 15 октября 2008

То, что я делаю в моем Makefile -

SRCS=$(wildcard *.c)

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

include depend

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

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

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

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

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

include $(DEPS)

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

5 голосов
/ 15 октября 2008

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

4 голосов
/ 17 октября 2008

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

2 голосов
/ 28 октября 2008

Использовать SCons

$ 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
  ...
1 голос
/ 15 октября 2008

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

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

...