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,就可以看到详细的编译信息