Linux cc与gcc

三个源文件: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
", 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的时候,别人会看不懂。

原文地址:https://www.cnblogs.com/lialong1st/p/7756664.html