等宏定义获取源文件所要依赖的头文件并且保存到相应的文件,从而作为源文件的预处理来提高文件编译速度。实际中,有两种方法获取这种依赖关系,一种是直接
使用makedepend工具,另外一种是通过gcc -C 获取。 我们分别简单介绍二者的使用。
这是一个简单的源文件,使用来测试va_list的。
/* main.c */
#include <stdio.h>
#include <stddef.h>
#include <stdarg.h>
int func(char *fmt, ...)
{
char * args;
va_list arg;
args = (char *)arg;
va_start(arg, fmt);
printf("%s sizeof(va_list) = %lu %d/n", fmt, sizeof(va_list), '//');
va_end(arg);
return 0;
}
int main(int argc, char *argvs[])
{
int b = 1;
int c = 0xFFF21334;
unsigned int d = c;
func("a = %d, b = %d/n", b);
printf("%d %d %d/n", c, d, ~(d - 1));
return 0;
}
1. 使用“gcc -C”
我们看一下makefile 文件
#makefile
SOURCES:=$(wildcard *.c)
TARGETS:=$(basename $(SOURCES))
CFLAGS += -Wall -DHACK -I/usr/lib/gcc/x86_64-linux-gnu/4.2/include/
CC:=/usr/bin/gcc
all: $(TARGETS)
depend: $(SOURCES)
@for file in $(SOURCES); do /
$(CC) $(CFLAGS) -M $$file; /
done > dep.mk
clean:
rm -rf $(TARGETS) *.o dep.mk
-include dep.mk
在命令行中输入make depend,那么一个包含依赖关系的dep.mk文件就生成了。内容如下:
main.o: main.c /usr/include/stdio.h /usr/include/features.h /
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h /
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h /
/usr/lib/gcc/x86_64-linux-gnu/4.2.3/include/stddef.h /
/usr/include/bits/types.h /usr/include/bits/typesizes.h /
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h /
/usr/lib/gcc/x86_64-linux-gnu/4.2.3/include/stdarg.h /
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
2 直接在命令行中执行 “makedepend -I/usr/lib/gcc/x86_64-linux-gnu/4.2/include/
main.c”就可以了。然后你可以查看Makefile文件,在文件末尾添加了一些依赖行信息
# DO NOT DELETE
main.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
main.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
main.o: /usr/include/gnu/stubs-64.h
main.o: /usr/lib/gcc/x86_64-linux-gnu/4.2/include/stddef.h
main.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
main.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
main.o: /usr/lib/gcc/x86_64-linux-gnu/4.2/include/stdarg.h
main.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
不过虽然二者的目的一样,但是建议使用地一种方法:1) 它包含相应的非头文件依赖信息, 2)依赖信息独立于makefile文件 3)无须额外的makedepend命令。