Linux系列笔记---------g++/gcc应该这样学!

Posted 嵌入式历练者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系列笔记---------g++/gcc应该这样学!相关的知识,希望对你有一定的参考价值。

作者:嵌入式历练者
ID : Eterlove
记下相关笔记,记录我的学习生活!站在巨人的肩上Standing on Shoulders of Giants!
该文章为原创,转载请注明出处和作者:https://blog.csdn.net/Eterlove/article/details/120929816

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\\n");
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

当你用vi编辑器打开hello.o时,你会发现看不懂,看不懂就对了,那是给机器看的机器码,只是未进行链接生成可执行文件。

这些基本命令学会就够用了,若遇到其他的会查Gcc手册就行,如果需要Gcc中文手册,评论区@我,以前还有上传免费资源,现在平台没有了,所以需要的私信我就可以了。

以上是关于Linux系列笔记---------g++/gcc应该这样学!的主要内容,如果未能解决你的问题,请参考以下文章

gcc/g++命令参数

Linux学习笔记

GTK学习笔记之Linux下Gtk环境搭建

gcc/g++使用笔记

Linux从青铜到王者第四篇:Linux开发项目之编译器和调试器

cmake的一系列问题