Pergunta

Eu sou obrigado a documentação escrita para o meu projeto atual que lista todos os arquivos .c e para cada um listas de cada arquivo .h que é direta ou indiretamente incluídos por esse arquivo.

Este é um projeto grande, e embora tenhamos Makefiles que, teoricamente, ter essa informação, essas Makefiles são, por vezes incorrecto (herdamos esse projeto de outra empresa). Nós muitas vezes tinha que fazer um make clean ; make para nossas mudanças para realmente ser refletido na recompilação, então eu não quero contar com estes Makefiles.

Então, há uma ferramenta que nos permite dar-lhe o nome de um arquivo .c e um caminho de inclusão e tê-lo nos dizer todos os arquivos .h que são direta ou indiretamente incluídos pelo arquivo .c? Não temos nada de estranho como

#define my_include "some_file.h"
#include my_include

para que a ferramenta não precisa ser perfeito. Qualquer coisa que procurou arquivos .c e .h em um caminho de inclusão para regular, inclui seria bom o suficiente.

Foi útil?

Solução

O que eu faço no meu Makefile é

SRCS=$(wildcard *.c)

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

include depend

Isto significa que se qualquer um dos arquivos de origem são atualizados, a regra será executada, e -M uso gcc dependem para atualizar o arquivo chamado dependem. Este é então incluído no makefile para fornecer as regras de dependência para todos os arquivos de origem.

Faça irá verificar se um arquivo está atualizado antes de incluí-lo, então isso depende regra será executada se necessário sempre que você executar make, sem necessidade de fazer um "make dependem".

Isto irá executar qualquer momento qualquer arquivo foi alterado. Eu nunca encontrei este um problema, mas se você tivesse um grande número de arquivos no diretório que você pode encontrá-lo levou muito tempo, caso em que você poderia tentar ter um arquivo de dependência por arquivo fonte, como este:

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

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

include $(DEPS)

Note que você pode usar -MM vez de -M para não incluir cabeçalhos do sistema.

Outras dicas

"gcc -M file.c" faz o que você precisa.

Uma alternativa para gcc -M é fastdep . relatórios autor do Fastdep fastdep a ser dez vezes mais rápido do que -M do gcc. Se o projeto leva um tempo para construir, fastdep pode valer a pena dar uma olhada.

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

Em MSVC (2005 e 2008, pelo menos, possivelmente outras versões como bem, mas não VC6) você pode obter o compilador para dizer-lhe todos os arquivos que foram incluídos durante a compilação. A saída é bastante detalhado, mas completa e bastante fácil de analisar com olhos humanos.

Em Configurações do projeto, vá para o C ++> guia C / Avançado e de alternância "Show Inclui", então reconstruir o seu projeto a partir do zero.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top