【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