【Linux系列笔记】---------g++/gcc应该这样学!(六)

1.g++/gcc的区别

【!】gcc 认为预处理后的文件(.i)是 C 文件,并且设定 C 形式的连接. 【!】g++ 认为预处理后的文件(.i)是 C++文件,并且设定 C++形式的连接.

2.程序的编译过程

    严格来说,源程序经过预处理(preprocessing), 编译(compilation), 汇编 (assembly),链接(linking)四个阶段生成可执行文件(a.out/a.exe) 在windows上生成可执行文件a.exe,而在Linux上生成a.out。当然你可以重新起个名字。 先来看这段代码,现在Linux上编译这个hello.c这个源文件,并生成可执行文件。
gcc hello.c -o www
这段代码告诉编译器编译hello.c文件,并生成一个名为www的可执行文件
-o是参数,给生成的文件起一个自己想要的名字,格式:-o 文件名(中间有个空格)
当然,-o参数位置可变,例如
gcc -o www hello.c

3.谈谈源文件后缀名

这个来自于Gcc手册,目前也有热心网友中文翻译的,中文有疑惑的以Gcc英文为准。 源文件后缀名指出语言种类以及后期的操作 .c C 源程序;预处理,编译,汇编 .C C++源程序;预处理,编译,汇编 .cc C++源程序;预处理,编译,汇编 .cxx C++源程序;预处理,编译,汇编 .m Objective-C 源程序;预处理,编译,汇编 .i 预处理后的 C 文件;编译,汇编 .ii 预处理后的 C++文件;编译,汇编 .s 汇编语言源程序;汇编 .S 汇编语言源程序;预处理,汇编 .h 预处理器文件;通常不出现在命令行上


.o 目标文件(Object file) .a 归档库文件(Archive file)

4.掌握基本命令

接下来我们先来写个超简单的代码: 创建一个hello.c,在vim编辑器写下hello代码

[root@localhost home]# ls
cheng
[root@localhost home]# touch hello.c
[root@localhost home]# vi hello.c
[root@localhost home]# gcc hello.c
[root@localhost home]# ls
a.out  cheng  hello.c
[root@localhost home]# ./a.out
hello
#include"stdio.h"
int main()
{
printf("hello
");
return 0;
}

如上所知,在没有加上参数-o,默认生成了a.out,执行文件a.out输出得到hello 【参数】-o filename 指定输出的文件为filename 我们继续这段代码,给编译后生成的可执行文件起个名字www

gcc hello.c -o www
或gcc -o www hello.c

[root@localhost home]# gcc -o www hello.c
[root@localhost home]# ls
a.out  cheng  hello.c  www
[root@localhost home]# ./www
hello

【参数】-E 预处理后即停止,不进行编译.预处理后的代码送往标准输出 可以使用-o 选项选择其他名字. 我们来看看只经过预处理阶段的代码:

gcc -E hello.c -o pre
当然你也能这样gcc -o pre -E hello.c
cat pre

验证命令是否正确,没有比自己亲手去试一试更好的方法! 用cat指令查看pre文件内容(不为只预处理后文件起个名字,它将在终端显示出来)

【参数】-S(注:大写) 编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件,可以使用-o 选项选择其他名字。

[root@localhost home]# gcc -o pre -E hello.c
[root@localhost home]# gcc -S hello.c
[root@localhost home]# ls
a.out  cheng  hello.c  hello.s  pre  www
cat hello.s

这段汇编代码对于汇编程序员很熟悉。 【注意-s(小写的s)】 经过验证,发现gcc -s www.c会在没有指定文件名的情况下直接生成a.out可执行文件(Linux),跟gcc www.c结果一致。

【参数】-c 汇编源文件,但是不作连接.简单说就是完成前三个阶段,生成.o文件不做链接,编译器输出对应于源文件的目标文件,可以使用-o 选项选择其他名字。

[root@localhost home]# gcc -c hello.c
[root@localhost home]# ls
a.out  cheng  hello.c  hello.o  hello.s  pre  www
[root@localhost home]# vi hello.o
经验分享 程序员 微信小程序 职场和发展