makefile中遇到的问题

1、现象:在makefile文件中使用
    main.o:main.c
      gcc -c $(CFLAGS) main.c
    file1.o:file.c
      gcc -c $(CFLAGS) file1.c
    正常编译,但是使用通配符
    %.o:%.c
      gcc -c $(CFLAGS) $<
    出现问题,编译显示g++ -c -o file1.c,$(CFLAGS)没有展开,并且将C文件按照C++文件编译
   解决办法:发现file1文件的扩展名为大写的C,将其改为小写的c,使用通配符编译通过
   原因:在makefile中将各个文件分开写时,忽略扩展名大小写;在使用通配符时,区分扩展名大小写

2、现象:修改.h文件,在文件中定义一个变量,但是在编译时,提示没有定义该变量。将该变量复制到源文件中显示定义了该变量。

   解决办法:将文件夹下的以.h.gch为扩展名的文件删除。

   原因:使用gcc编译文件.h,会出现了一个以.h.gch为扩展名的文件, 这是gcc的一种预编译技术——预编译头技术,就是将头文件译 成一种二进制中间格式,以供后续编译使用的。gcc在编译过程中会自动查找相应的.gch文件,并且自动检测其可用性,如果不可用,gcc会给出警告,然后使用对应的.h文件,抛弃当前.gch。运用了预编译头技术,gcc在后续的多次编译过程中可以节约很多的编译时间。

3、简单的范例

  范例一:源文件、头文件和makefile在一个文件夹中

    OBJS = main.o file1.o file2.o file3.o

 

    CFLAGS += -D __MACRO1__
    CFLAGS += -D __MACRO2__  

 

    %.o:%.c
       gcc -c $(CFLAGS) $< -o $@

 

    all:$(OBJS)
       gcc  $(OBJS) -o C3 

 

    clean:
       rm *.o C3

  范例二:源文件在文件夹src中、将生成的OBJ文件放到objs文件夹中,makefile在当前目录下

    OBJS = main.o file1.o file2.o file3.o

    CFLAGS += -I ./src
    VPATH = src

    CFLAGS += -D __MACRO1__
    CFLAGS += -D __MACRO2__

    %.o:%.c
       gcc -c $(CFLAGS) $< -o $@

    all:$(OBJS)
       gcc  $(OBJS) -o C3  
       cp *.o ./objs
       rm *.o

    clean:
       rm -rf ./objs/*.o C3

 

 

 
posted @ 2012-07-14 14:07  meili1021  阅读(586)  评论(0)    收藏  举报