Linux cc与gcc

来源:互联网 发布:VPN服务器指向域名 编辑:程序博客网 时间:2024/05/17 00:56

三个源文件:main.c sum.c show.c

/* main.c */    extern int sum(int m, int n);  extern void show(int data);    int main(void)  {        show(sum(3, 5));        return 0;  }  /* sum.c */    int sum(int m, int n)  {      return m+n;  }  /* show.c */    #include <stdio.h>    void show(int data)  {      printf("%d\n", data);  }  
Makefile大体上有两种写法:

(第一种)

#Makefile    objs=main.o sum.o show.o  main:$(objs)      gcc $^ -o $@  main.o:main.c      gcc -c $<  sum.o:sum.c      gcc -c $<  show.o:show.c      gcc -c $<  clean:      rm -rf *.o .*.sw?  
(第二种)

/* Makefile */    objs=main.o sum.o show.o  main:$(objs)      gcc $^ -o $@  clean:      rm -rf *.o .*.sw?  

下面列举以上两种的编译过程:

(第一种)

cc -c -o main.o main.c

cc -c -o sum.o sum.c

cc -c -o show.o show.c

gcc main.o sum.o show.o -o main

(第二种)

gcc -c main.c

gcc -c sum.c

gcc -c show.c

gcc main.o sum.o show.o -o main


以上两种Makefile写法都能正确编译和输出,此时很容易看出区别,虽然第二种看起来省略很多,但是各有利弊,下面介绍异同:

1、写的makefile的时候我们是可以省略生成.o文件那一步,直接由C文件生成的(源文件比较少时OK);

2、编译的时候,目录里面没有main.o  sum.o show.o这个文件,但是硬要强制去编译这个的话,系统就会用cc自动先把相关的.c文件转化成相关的.o文件;

3、第二种(简单的)方法可以用(但是建议不要这么用),如果编译的文件比较多,而且彼此之间交叉的多的时候,容易出问题,如果出了问题,处理的时候就不容易查找问题 ;

4、要是找别人给你调试Makefile的时候,别人会看不懂。