商城网站建设需要什么团队,南山网站seo,wordpress ajax取头像,WordPress 支付宝支付文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介
首先#xff0c;什么是编译器呢#xff1f; 我们可以使用编辑器#xff08;如 linux 下的 vi、windows 下…
文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介
首先什么是编译器呢 我们可以使用编辑器如 linux 下的 vi、windows 下的记事本来写程序编辑代码。但是我们写的程序中的代码语句电脑是看不懂的我们需要把它转成电脑能懂的语句编译器就是这样的转化工具。就是说我们用编辑器编写程序由编译器编译后才可以运行编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。
那什么是 GCC 编译器
gccGNU Compiler CollectionGNU 编译器套件是由 GNU 开发的编程语言编译器。gcc 作为GNU操作系统的官方编译器现已被大多数类 Unix 操作系统如Linux、BSD、Mac OS X等采纳为标准的编译器gcc 同样适用于微软的 Windows。gcc 最初用于编译 C 语言随着项目的发展 gcc 已经成为了能够编译 C、C、Java、Ada、fortran、Object C、Object C、Go 语言的编译器大家族。GCC 常用来编译 C/C 语言 它不仅支持 C 的许多“方言”也可以区别不同的 C/C 语言标准也可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个 C/C 标准。例如当使用命令行参数 -stdc99 启动 GCC 时则编译器支持 C99 标准。
如何安装使用 GCC 呢 linux ubuntu 下可以通过 sudo apt install gcc g 安装命令安装。 查看版本 gcc/g -v/–version
yxm192:~$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.【注意】如果需要支持 c11gcc 版本需要 4.8.5。
二、GCC 工作流
编程语言的发展
计算机语言的发展 总体分三个阶段
第一代机器语言机器语言是微处理器理解和使用的用于控制它的操作二进制代码。 优点:直接执行速度快资源占用少缺点:可读性、可移植性差编程繁杂 第二代汇编语言 一种面向机器的低级语言通常是为特定的计算机或系列计算机专门设计的。汇编语言是机器指令的符号化表示故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性得到质量较高的程序。汇编语言虽然能编写高效率的程序,但是学习和使用都不是易事并且很难调试。第三代高级语言高级语言主要是相对于汇编语言而言的它是较接近自然语言和数学公式的编程基本脱离了机器的硬件系统用人们更易理解的方式编写程序。编写的程序称之为源程序。
GCC 工作流程
从上面的编程语言的发展过程可以知道我们现在常说的编程语言一般都是高级语言编写的程序称之为源程序。编译器其实就相当于一个翻译器将高级语言翻译成机器语言以便机器可以识别。
gcc 编译器从拿到一个c 源文件到生成一个可执行程序中间一共经历了四个步骤 四个步骤并不是 gcc 独立完成的而是在内部调用了其他工具从而完成了整个工作流程 【注意】头文件展开其实就是把头文件中的内容复制到 .c/.c 源代码文件中。
gcc 和 g 的区别
理解了 GCC 的工作流程接下来说一下 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二者等价
总结看到上面的误区你可能能够理解了但是使用起来比较晕那么不妨给自己一个规则gcc 编译 c 代码g 编译 c 代码。
三、使用 GCC 编译
GCC 编译格式
首先了解一下GCC 编译命令的格式 命令 选项 输出可执行文件的文件名 文件名 gcc [options] [file] file… g [options] [file] file…
命令、选项和源文件之间使用空格分隔一行命令中可以有零个、一个或多个选项文件名可以包含文件的绝对路径也可以使用相对路径如果命令中不包含输出可执行文件的文件名可执行文件的文件名会自动生成一个默认名Linux平台为a.outWindows平台为 a.exe。
GCC 常用选项
选项作用-o指定生成的输出文件名为file【注意】除了上面的编译格式-o 还可以使用另外一种编译格式如下所示命令 文件名 选项 输出可执行文件的文件名 gcc file… [options] [file]g file… [options] [file]-E只进行预处理-S(大写)只进行预处理和编译-c(小写)只进行预处理、编译和汇编-v / --version查看gcc版本号-g包含调试信息该程序可以被调试器调试-On n0~3编译优化n越大优化得越多。n的取值范围0~3。编译器的优化选项的4个级别-O0表示没有优化-O1为缺省值-O3优化级别最高-Wall提示更多警告信息-D编译时定义宏-L指定编译的时候搜索的库的路径。-I directory即指定 include 包含文件的搜索目录-w不生成任何警告信息-l在程序编译的时候指定使用的库-std指定C方言如:-stdc99gcc默认的方言是GNU C-shared生成共享目标文件通常用在建立共享库时
【注意】上表中仅列出了常用的一些指令选项事实上这仅是冰山一角GCC 编译器提供有大量的指令选项可满足我们在大部分场景下的编译需求。有关更多的编译指令感兴趣的读者可自行查看 GCC 手册。
GCC 编译流程
如上面的文章所讲C 或者 C 程序从源代码生成可执行程序的过程需经历 4 个过程分别是预处理、编译、汇编和链接。同样使用 GCC 编译器编译 C 或者 C 程序也必须要经历这 4 个过程。下面以运行 C 语言程序为例给大家演示如何使用 gcc 快速获得对应的可执行程序。如下就是一段 C 语言程序
// test.c 文件
#include stdio.h
#define PI 3.14
int main()
{int sum PI 10;printf(Hello World\n);return 0;
}# 第一步: 进行预处理
yxm192:~$ gcc -E test.c -o test.i
yxm192:~$ ls
company_project install myshare test.c test.i# 第二步: 生成汇编文件
yxm192:~$ gcc -S test.i -o test.s
yxm192:~$ ls
company_project install myshare test.c test.i test.s# 第三步: 生成目标代码
yxm192:~$ gcc -c test.s -o test.o
yxm192:~$ ls
company_project install myshare test.c test.i test.o test.s# 第四步: 生成可以执行文件
yxm192:~$ gcc test.o -o test
yxm192:~$ ls
company_project install myshare test test.c test.i test.o test.s# 第五步: 执行
yxm192:~$ ./test
Hello World但考虑在实际使用中我们可能并不关心程序的执行结果只想快速得到最终的可执行程序因此 gcc 和 g 都对此需求做了支持可以直接将源文件生成一个可以执行文件
yxm192:~$ gcc test.c -o test
yxm192:~$ ls
company_project install myshare test test.c
yxm192:~$ ./test
Hello World可以看到GCC 编译器支持使用 gccg指令“一步编译”指定的 CC程序。【注意】虽然我们仅编写了一条 gcc 或者 g 指令但其底层依据是按照预处理、编译、汇编、链接的过程将 C 、C 程序转变为可执行程序的。而本应在预处理阶段、编译阶段、汇编阶段生成的中间文件此执行方式默认是不会生成的只会生成最终的 a.out 可执行文件。
如果不指定输出文件名字gcc 编译器会生成一个默认的可以执行文件 a.out
yxm192:~$ gcc test.c
yxm192:~$ ls
a.out company_project install myshare test.c
yxm192:~$ ./a.out
Hello Worldgcc -D 选项下面以运行 C 语言程序为例给大家演示如何使用 gcc -D 选项的使用。如下就是一段 C 语言程序
// test.c
#include stdio.h
int main(void)
{int a 3;
#ifdef DEBUGprintf(hello itcast\n);
#endifprintf(hello world\n);return 0;
}yxm192:~$ gcc test.c -DDEBUG
yxm192:~$ ls
a.out company_project install myshare test.c
yxm192:~$ ./a.out
hello itcast
hello world我们在工作的时候软件一般有两个版本一个发行版本release 版本一个是调试版本debug 版本如果在编译时指定-D参数如上所示就相当于是调试版本可以打印调试信息如果在编译时不指定-D参数就相当于发行版本。【补充】release 版本一般要求我们把调试信息、log 信息等输出信息都删除掉因为频繁的输出会大大降低程序的执行效率。
我们还可以通过 -D 选项设置宏的值如下例所示
// test.c
#include stdio.h
int main(void)
{printf(SIZE: %d\n, SIZE);return 0;
}dengitcast:~/test$ gcc 2test.c -DSIZE10
dengitcast:~/test$ ./a.out
SIZE: 10多个源文件编译
如果需要编译多个源文件基本上有两种编译方法假设有两个源文件为 file1.c 和 file2.c
多个文件一起编译 用法gcc file1.c file2.c -o file 作用将 file1.c 和 file2.c 分别编译后链接成 file 可执行文件。
【注意】此时 file1.c、file2.c 这两个文件没有先后关系位置随意放置。
分别编译各个源文件之后对编译后输出的目标文件进行链接。# 用法
gcc -c file1.c # 将file1.c编译成file1.o
gcc -c file2.c # 将test.c编译成file2.o
gcc -o file1.o file2.o -o file # 将file1.o和file2.o链接成file
# gcc -o *.o -o file # 简洁写法等价于 gcc -o file1.o file2.o -o file总结以上两种方法相比较第一种方法编译时需要所有文件重新编译而第二种方法可以只重新编译修改的文件未修改的文件不用重新编译。