I wrote a little Perl script to scan a bunch of C/C++ source files and extract a graph of inter-module dependencies, both compile-time (e.g. #includes) and link-time.
The script: scan-depends.pl (alternate link for inline browsing). This script is still evolving, but the version here is quite usable.
usage: ./scan-depends.pl [options] sourcefile [sourcefile ...] This program reads each of the source files specified on the command line, and emits a graph of their interdependencies in the Dot graph file format. The source files should *not* be qualified with a path, but instead be inside some directory specified with -I. Options: -I<dir> Add <dir> to the list of directories to search when looking for #included files (files which are included but not found are not printed as dependencies). -X<name> Exclude module <name> from the graph. If a number is -X<name>=n specified, at most that many incoming links will be shown. -S<name> Do not process any outgoing edges from module <name>. This is useful when <name> is the entry point to a subsystem whose dependencies are charted separately. -r Recursively follow dependencies for files encountered. -q Suppress warnings. -d Enable debug messages. -h,-help Print this usage string.
The dependency graph is output in the Dot format. Dot is responsible for laying out the graph in a comprehensible way. Information on Dot (including sources to download) can be found at http://www.research.att.com/sw/tools/graphviz/.
Example output is below. Compile-time dependencies are shown as solid arrows, and link-time dependencies are dashed arrows. Modules are circled, and header files are uncircled.
Or, in postscript: gramanl.ps
A small sample of related work: