全部博文(395)
分类: 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,我在那里能够找到他的定义?