Как перечислить все файлы, которые включают заголовочный файл - PullRequest
3 голосов
/ 10 мая 2011

Стандартный поиск cscope для «Найти файлы # включая этот файл»

возвращает только те совпадения, где foo.h напрямую включен в bar.c

Но меня интересуют все эти файлыкоторые прямо или косвенно

(например, включая заголовочный файл, включающий foo.h) включают в себя foo.h

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

Если вы используете GCC, запустите cpp -H на всех модулях и grep для требуемого заголовка:

header=foo.h

# *.c or all interesting modules
for i in *.c; do
    # there's bound to be a cleaner regex for this
    cpp -H "$i" 2>&1 >/dev/null | grep -q "^\.* .*/$header" && echo "$i"
done
0 голосов
/ 10 мая 2011

Этот пост может помочь вам:

make включает генерацию директивы и зависимости с -MM

По сути, make может генерировать список всех зависимостей в проекте. Я использую следующее во всех моих файлах make:

# Generate dependencies for all files in project
%.d: $(program_SRCS)
    @ $(CC) $(CPPFLAGS) -MM $*.c | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@

clean_list += ${program_SRCS:.c=.d}

# At the end of the makefile
# Include the list of dependancies generated for each object file
# unless make was called with target clean
ifneq "$(MAKECMDGOALS)" "clean"
-include ${program_SRCS:.c=.d}
endif

Пример того, что это делает. Допустим, у вас есть foo.cpp, который включает в себя foo.h, который включает в себя bar.h, который включает в себя baz.h. Выше сгенерирует файл foo.d и включит его в ваш файл make. Файл зависимостей foo.d будет выглядеть так:

foo.d foo.o: foo.cpp foo.h bar.h baz.h

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

Затем, чтобы найти все файлы, которые содержат определенный заголовок, просто grep -l foo.h *.d, чтобы узнать, какие исходные файлы включают foo.h.

...