做美食哪些类型网站,小型企业网方案设计5000字,使用socket登陆wordpress源码,个人域名备案有什么风险在windows开发平台#xff0c;我们用惯了vc、vs等IDE#xff08;集成开发环境#xff09;#xff0c;在编译好源代码之后#xff0c;按下相应按钮#xff0c;IDE就会为我们完成编译#xff0c;链接的过程。然而在Linux平台下#xff0c;却没有这么方便的开发环境#…在windows开发平台我们用惯了vc、vs等IDE集成开发环境在编译好源代码之后按下相应按钮IDE就会为我们完成编译链接的过程。然而在Linux平台下却没有这么方便的开发环境很多事情都需要我们亲力亲为为此我们要了解两款编译器gcc/g它们分别是GNU的c/c编译器。 下面来具体了解一下这两款编译器 1、gcc/g的安装 在终端输入两条命令即可: (1)安装gcc Debian系列sudo apt-get install gcc RedHat系列sudo yum install gcc (2)安装g Debian系列sudo apt-get install g RedHat系列sudo yum install gcc-c
PSDebian系列的系统可以用一条命令sudo apt-get install build-essential来安装gcc、g、make这一套工具。
2、gcc/g的编译过程 我们都知道编写好的源代码在生成可执行程序的过程中需要以下四步预处理、汇编、编译、链接同样的我们的工具gcc/g在为我们生成可执行程序的过程中也经历了上述四步下面我们来具体看看这四个执行步骤。 下文图片中出现的Makefile文件是我为了方便我的编译创建的一个文件不用理会。 这里以gcc举例g与之类似首先编写源文件
先用touch命令创建我们要编写的源文件 接着编辑源文件的内容
//tran.h
1 #include stdio.h
2
3 void tran();
//tran.c
1 #include tran.h
2
3 void tran()
4 {
5 printf(this is tran\n);
6 }
//test.c
1 #include tran.h
2 #define NUM 1234
3
4 int main()
5 {
6 printf(%d\n, NUM);
7 tran();
8 return 0;
9 }
然后来看看文件编译后的状态这儿只看test.c的tran.c的与之相似头文件无法编译
(1)预处理生成.i的文件 预处理这个步骤为我们完成的工作是宏替换、头文件展开、条件编译、特殊符号的处理。使用的命令是 gcc -E x.c -o x.i //这里的x指的是依赖的文件的文件名和要生成的文件名 -E该选项的作用用是让 gcc 在预处理结束后停止止编译过程。 -o指定生成的文件名。 例如 可以看到这里已经生成了一个名字为test.i的文件
用cat命令看一下文件test.i的内容 可以看到头文件tran.h已经被替换为上面那些乱七八槽的东西了宏NUM也被替换为它对应的数字1234。
(2)编译生成汇编文件.s 编译程序,所要作的工作就是通过词法分析、语义分析、符号汇总和语法分析在确认所有的指令都符合语法规则之后将其翻译成等价的中间代码表示或汇编代码。使用的命令是 gcc -S x.i -o x.s //这里的x指的是依赖的文件的文件名和要生成的文件名 -S该选项只进行编译而不进行汇编,生成汇编代码。 -o指定生成的文件名 例如 可以看到已经生成了名为test.s的文件
用cat命令看一下test.s的内容 可以看到确实是生成了汇编代码
(3)汇编生成目标文件 .o文件 汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程也就是说把汇编代码转换为二进制文件即目标文件目标文件中所存放的是与源程序等效的目标的机器语言代码。 目标文件由段组成一个目标文件中至少有两个段 代码段主要包含的是程序的指令。该段一般是可读、可执行、不可写。 数据段主要存放程序中的全局变量或静态的数据。一般数据段都是可读、可执行、可写 。 这儿使用的命令是 gcc -c x.s -o x.o -c将汇编代码生成二进制的目标文件 -o指定生成的文件名 例如 可以看到已经生成了文件tets.o
(4)链接生成可执行程序 由汇编程序生成的目标文件并不能立即就被执行其中可能还有许多没有解决的问题。例如某个源文件中的函数可能引用了另一个源文件中定义的某个符号如变量或者函数调用等在程序中可能调用了某个库文件中的函数等等。所有的这些问题都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同链接处理可分为两种 1静态链接在这种链接方式下函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合其中的每个文件含有库中的一个或者一组相关函数的代码。(个人备注静态链接将链接库的代码复制到可执行程序中使得可执行程序体积变大) 2动态链接在此种方式下函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。个人备注动态链接指的是需要链接的代码放到一个共享对象中共享对象映射到进程虚地址空间链接程序记录可执行程序将来需要用的代码信息根据这些信息迅速定位相应的代码片段。可移植性差 这儿使用的命令是 gcc -o x x1.o x2.o …… 这儿的-o后面的x是生成的可执行程序的名称x1.o,x2.o……是所有需要被链接到一起的.o文件。 例如 这儿省略了tran.o的生成过程 可以看到已经生成了可执行文件test 3、gcc/g的选项扩展 当然我们平时不用这么麻烦的一步步执行下来上面是为了展示一下gcc的编译过程平时我们在编译.c文件时直接使用命令 gcc -o file file1.c file2.c …… file是生成的可执行程序的名字file1.cfile2.c是要用到的源文件。
下面列出一些常见的gcc选项 1、-O0 -O1 -O2 -O3 译器的优化选项的4个级别,-O0表示示没有优化,-O1为缺省值,-O3优化级别最高高 2、-w 不生生成任何警告信息 3、-Wall 生成所有警告信息。 4、-g 生成调试信息。GNU 调试器可利用用该信息。 5、-static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大。 6、-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。