GCC什么是 GCC ?GCC 原名为 GNU C语言编译器GNU C CompilerGCCGNU Compiler CollectionGNU编译器套件是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C、C、Objective-C、Java、Ada 和 Go 语言前端也包括了这些语言的库如 libstdclibgcj等GCC 不仅支持 C 的许多“方言”也可以区别不同的 C 语言标准可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。例如当使用命令行参数-stdc99启动 GCC 时编译器支持 C99 标准。安装命令 sudo apt install gcc g 版本 4.8.5查看版本 gcc/g -v/–version编程语言的发展gcc 和 g 的区别gcc 和 g都是GNU(组织)的一个编译器。误区一gcc 只能编译 c 代码g 只能编译 c 代码。两者都可以请注意后缀为 .c 的gcc 把它当作是 C 程序而 g 当作是 c 程序后缀为 .cpp 的两者都会认为是 C 程序C 的语法规则更加严谨一些编译阶段g 会调用 gcc对于 C 代码两者是等价的但是因为 gcc 命令不能自动和 C 程序使用的库联接所以通常用 g 来完成链接为了统一起见干脆编译/链接统统用 g 了这就给人一种错觉好像 cpp 程序只能用 g 似的误区二gcc 不会定义 cplusplus 宏而 g 会实际上这个宏只是标志着编译器将会把代码按 C 还是 C 语法来解释如上所述如果后缀为 .c并且采用 gcc 编译器则该宏就是未定义的否则就是已定义误区三编译只能用 gcc链接只能用 g严格来说这句话不算错误但是它混淆了概念应该这样说编译可以用gcc/g而链接可以用 g 或者 gcc -lstdc。gcc 命令不能自动和C程序使用的库联接所以通常使用 g 来完成联接。但在编译阶段g 会自动调用 gcc二者等价环境与准备建议通过 Xshell 远程执行终端vscode 书写代码。(1) 安装 gcc 和 g 编译器用管理员权限安装 gcc 和 g 编译器sudoaptinstallgcc g说明命令说明sudo以管理员权限执行命令aptUbuntu/Debian 系统的包管理工具install安装软件包的子命令gccC 语言编译器gC 语言编译器这里我已经安装过了查看安装是否成功一次性查看 gcc 和 g 两个编译器的详细版本信息gcc-vg-v-v说明全称--verbose详细模式作用显示完整的编译环境、配置、路径、内置宏、链接库输出内容极多适合查错、看配置简写-v (只有一个横杠)一次性查看 gcc 和 g 两个编译器的简单版本信息gcc--versiong--version--version说明全称--version查看版本作用只显示版本号、版权、编译器信息输出非常简短只看版本用这个正规写法--version两个横杠(2) 清理终端这里分享一个快捷键 Ctrl L 可以清屏。(3) 初识创建、编译、运行创建文件夹查看当前目录下的所有文件和文件夹 (ls是 list 的缩写列出)ls创建名为 linux 的文件夹 (mkdir是 make directory 的缩写直译就是创建目录 / 创建文件夹)mkdirlinux进入 linux 文件夹并创建 lesson02 文件夹(cd是 change directory 的缩写直译就是改变目录也就是切换文件夹)cdlinuxmkdirlesson02创建 test.c 文件创建 test.c 文件 (touch: 触碰如果文件不存在就创建否则就把文件的访问时间、修改时间改成当前系统时间)touchtest.c编译及运行程序编译 test.c 文件成一个可以直接运行的程序命名 app-o是--output的缩写自定义输出程序的名字。gcc test.c-oapp运行 app 程序./appgcc 不带-o时的默认行为不指定-o时输出文件固定叫 a.out这是 C 语言早期编译器遗留下来的习惯“assembler output” 的缩写汇编程序输出GCC常用参数选项gcc编译选项说明-E预处理指定的源文件不进行编译-S编译指定的源文件但是不进行汇编-c编译、汇编指定的源文件但是不进行链接-o [file1] [file2] / [file2] -o [file1]将文件 file2 编译成可执行文件 file1(仅指定生成的可执行文件叫什么名字)-I directory指定 include 包含文件的搜索目录-g在编译的时候生成调试信息该程序可以被调试器调试-D在程序编译的时候指定一个宏-w不生成任何警告信息-Wall生成所有警告信息-Onn的取值范围0~3。编译器的优化选项的4个级别-O0表示没有优化-O1为缺省值-O3优化级别最高-l在程序编译的时候指定使用的库-L指定编译的时候搜索的库的路径-fPIC/-fpic生成与位置无关的代码-shared生成共享目标文件通常用在建立共享库时-std指定C方言如:-stdc99gcc默认的方言是GNU C(1)-o的两种用法将指定文件编译成可执行文件并命名。(2)-D的用法在程序编译的时候指定一个宏。1.在主机新建了一个 test.c 文件#includestdio.hintmain(){inta10;#ifdefDEBUGprintf(我是程序猿...\n);#endiffor(inti0;i3;i){printf(hello, GCC!\n);}return0;}2.再通过 Xftp 将主机的 test.c 文件拖入虚拟机3.检查一下确定复制成功4.编译并运行程序这里可以发现终端并没有输出 “我是程序猿…”那是因为还没有定义宏DEBUG。5.定义宏DEBUG并再次编译可以看到 “我是程序猿…” 成功被输出。#ifdefDEBUGprintf(调试信息变量x的值是%d\n,x);#endif一般在 release 版本中输出调试信息会降低程序运行效率但是开发调试时又需要输出调试信息方便排查问题定义宏和-D 宏名的出现可以很好解决这个问题。(3)-Wall的用法生成所有警告信息。可以看到终端输出有未被使用的变量。GCC工作流程(1) 预处理 test.c 为 test.i#includestdio.h#definePI3.14intmain(){// 这是测试代码intsumPI10;printf(hello,world!\n);return0;}以上是 test.c 文件内容接着进行预处理并命名为 test.i 文件gcc test.c-E-otest.i;从预处理前后对比可以看到预处理后的源代码已经将头文件内容复制进源文件还进行了宏替换并且删去注释。(2) 将 test.i 编译成汇编代码gcc test.i-S-otest.s(3) 汇编成目标文件gcc test.s-c-otest.o删去其他文件保留 test.c 进行测试-S如上图所示-S命令做了预处理和编译两步步骤gcc test.c做了预处理、编译、汇编以及链接的步骤