Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2307811
  • 博文数量: 395
  • 博客积分: 10994
  • 博客等级: 上将
  • 技术积分: 5586
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 19:49
文章存档

2014年(1)

2013年(10)

2012年(74)

2011年(303)

2010年(7)

分类: LINUX

2011-07-23 22:38:15

今天我照着试了一下makefile的隐含规则,出现了问题,很郁闷,主要问题是:用CCFLAGS=-o或者用其他任何的变量作为gcc编译的参数(如:aaaa=-o)都正确,但是我用CFLGS=-o 出现错误,有没有人给我解释一下这是为什么?(同时有个诡异的情况,如果不用隐含规则的话,用CFLGS=-o却是正常的。。。)

 

到底哪个是make的预定义参数:CCFLAGS,还是CFLAGS?郁闷。。。麻烦能解释一下啊么?是不是不能使用CFLAGS呀?如果大家不信的话,可以把这段程序放到你们电脑上执行一下试试。。。。

 

[root@feifei p3.3]# ls

makefile.p3.3  p3.3.c  p3.3.o  p3.3.part1.c  p3.3.part2.c

[root@feifei p3.3]# vi p3.3.part1.c

#include

void part_one(){

        printf("in the part one function!\n");

}

                                                                           

[root@feifei p3.3]# vi p3.3.part2.c

#include

void part_two(){

        printf("now in part two function\n");

}

 

[root@feifei p3.3]# vi p3.3.c

#include

extern void part_one();

extern void part_two();

 

int main(void){

        part_one();

        part_two();

        return 0;

}

 

上面是三个c文件,下面是makefile文件

[root@feifei p3.3]# ls

makefile.p3.3  makefile.p3.3.yihan  p3.3.c  p3.3.part1.c  p3.3.part2.c

[root@feifei p3.3]# vi makefile.p3.3.yihan

CC=gcc

#bbb=-o

#aaaa=-o

#CCFLAGS=-o

CFLAGS=-o

 

p3.3:p3.3.part1.o p3.3.part2.o p3.3.o

        $(CC) $(CFLAGS) $@ p3.3.o p3.3.part1.o p3.3.part2.o

clean:

        rm p3.3.part1.o

        rm p3.3.part2.o

        rm p3.3

        rm p3.3.o

[root@feifei p3.3]# make -f makefile.p3.3.yihan

gcc -o   -c -o p3.3.part1.o p3.3.part1.c

/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../crt1.o: In function `_start':

(.text+0x18): undefined reference to `main'

collect2: ld 返回 1

make: *** [p3.3.part1.o] 错误 1

然后我改为CCFLAGS,如下:

[root@feifei p3.3]# vi makefile.p3.3.yihan

CC=gcc

#bbb=-o

#aaaa=-o

CCFLAGS=-o

#CFLAGS=-o

 

p3.3:p3.3.part1.o p3.3.part2.o p3.3.o

        $(CC) $(CCFLAGS) $@ p3.3.o p3.3.part1.o p3.3.part2.o

clean:

        rm p3.3.part1.o

        rm p3.3.part2.o

        rm p3.3

        rm p3.3.o

[root@feifei p3.3]# make -f makefile.p3.3.yihan

gcc    -c -o p3.3.part1.o p3.3.part1.c

gcc    -c -o p3.3.part2.o p3.3.part2.c

gcc    -c -o p3.3.o p3.3.c

gcc -o p3.3 p3.3.o p3.3.part1.o p3.3.part2.o

 

当然了,我改为上面的aaaa变量或者bbb变量也是编译正常的,可是就是CFLAGS就不对。。。。

 

有谁能解释一下么?

还有一点,就是如果我不用隐含规则的话,使用CFLAGS却是可以的,怎么回事,如下:

[root@feifei p3.3]# vi makefile.p3.3

CC=gcc

CFLAGS=-o

OBJFLAGS=-c

 

p3.3:p3.3.part1.o p3.3.part2.o p3.3.o

        $(CC) $(CFLAGS) $@ p3.3.part1.o p3.3.part2.o p3.3.o

p3.3.part1.o:p3.3.part1.c

        $(CC) $(OBJFLAGS)  p3.3.part1.c

p3.3.part2.o:p3.3.part1.c

        $(CC) $(OBJFLAGS)  p3.3.part2.c

p3.3.o:p3.3.c

        $(CC) $(OBJFLAGS)  p3.3.c

 

clean:

        rm p3.3.part1.o

        rm p3.3.part2.o

        rm p3.3.o

        rm p3.3

[root@feifei p3.3]# make -f makefile.p3.3

gcc -c  p3.3.part1.c

gcc -c  p3.3.part2.c

gcc -c  p3.3.c

gcc -o p3.3 p3.3.part1.o p3.3.part2.o p3.3.o

 

问题阐述清楚了,希望高手能说明一点,这是怎么回事,还一个问题,为什么这个CC指定的是cc,我在那里能够找到他的定义?

阅读(13836) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~