Linux中gcc命令详解以及Makefile文件编写

本篇文章并不讨论cc和gcc还有g++的区别,他们之间的关系,https://blog.csdn.net/CodeHeng/article/details/41242349这篇文章说的很清楚,本篇文章单纯来说gcc的用法:

1、gcc命令:

(1)gcc hello.c

这个命令是编译并且链接hello.c文件,并且生成a.out的可执行文件,之后运行a.out可执行文件就可以了。

(2)gcc -c hello.c 

这个命令是只对hello.c文件进行编译,并不进行后续的链接工作,编译完成后,会生成hello.o的目标文件。

(3)gcc -o hello hello.o

这个命令是对hello.o目标文件进行链接,生成名为hello的可执行文件

上面的栗子都是在文件是一个的基础上,但是一个大的工程一半都有很多文件组成,那么这时候改怎么来在Linux环境下进行编译呢???命令是类似的。

(4)gcc -c thanks.c thanks2.c

和命令(2)类似,这个命令是对thanks.c和thanks2.c进行编译,进行语法检查,生成thanks.o和thanks2.o的目标文件。

(5)gcc -o thanks thanks.o thanks2.o

和命令(3)类似,这个命令是对thanks.o 和thankx2.o 进行链接,生成thanks的可执行二进制文件。

上面只是以两个文件为例,但是如果我们有很多个文件,那么每次都要输入那么多命令,会很麻烦,如果你足够了解Linux命令,那么可以用shell文件来解决,但是如果工程很大呢?每次编译都要很长时间来完成,但是你每次都只是改动一个很小的地方,花费那么长的时间去编译,很不值得,因此,我们需要编写Makefile文件来解决以上问题:

2、Makefile文件的编写:

(1)Makefile文件的基本语法与变量:

目标(target):目标文件1 目标文件2

<tab> gcc -o 欲新建的可执行文件 目标文件1 目标文件2

目标(target)就是我们想要建立的信息,而目标文件就是具有相关性的 object files 那建立可执行文件的语法忽悠上古以<tab>按键开头的那一行

注意:命令行必须以tab键作为开头才行

(2)规则:

在Makefile文件中,#代表批注

<tab>键需在命令行的第一个字符

目标(target)与相关文件(就是目标文件)之间需要以“:”隔开

实例:

main: main.o haha.o sin_value.o cos_value.o

  gcc -o main main.o haha.o sin_value.o cos_value.o -lm

clean:

  rm -f main main.o hah.o sin_value.o cos_value.o

在第二行中,-lm表示调用libm.a函数库,lib和.a 省略不写

输入命令:make clean

则执行第四行

可以看到,上面的Makefile文件重复的数据很多,一个一个写起来还是很繁琐,既然Makefile文件类似于shell script,那么我们是不是可以将shell中的变量的概念引入呢?

LIBS = -lm

OBJS = main.o haha.o sin_value.o cos_value.o

main: ${OBJS}

  gcc -o main ${OBJS} ${LIBS}

clean:

  rm -f main ${OBJS}

调用的命令跟上一个Makefile文件是一样的。

为了输出详细的编译信息,我们可以给加上-Wall参数,在上面的Makefile文件的第三行后加上一行,CFLAGS = -Wall,就可以看到详细的编译信息

原文地址:https://www.cnblogs.com/PIRATE-JFZHOU/p/8922508.html