重庆企业网站如何推广,怎么建设一个外国网站,如何在百度提交网站,专门做防盗门的网站目录
Linux下的编辑器
介绍#xff1a;
1#xff0c;编辑器gcc/g
1-1#xff0c;系统的编译过程
1-2#xff0c;预处理过程
1-3#xff0c;编译过程
1-4#xff0c;汇编过程
1-5#xff0c;链接过程 Linux下的编辑器
介绍#xff1a; Linux系统下可支持很多高…目录
Linux下的编辑器
介绍
1编辑器gcc/g
1-1系统的编译过程
1-2预处理过程
1-3编译过程
1-4汇编过程
1-5链接过程 Linux下的编辑器
介绍 Linux系统下可支持很多高级语言的编辑不同的编辑工具对应不同的语言。本章我们重点介绍C语言的编辑器 gcc 和C的编辑器 g其中g也可编辑C语言的文本但gcc不可编辑C的文本。
1编辑器gcc/g 我们都知道文件的编译过程需要经过预处理、编译、汇编、链接过程直接 gcc [文件] 将会直接一次性执行完编辑文本的过程形成可执行文件。 上图中我们形成的可执行文件是系统默认命名的使用 gcc code.c -o code.exe 或 gcc -o code.exe code.c 都将可执行文件命名为code.exe即凡是跟在 -o 选项后面的名称都是可执行文件的命名。 1-1系统的编译过程 众所周知计算机的语言发展先是从二进制语言到汇编语言然后不断发展有了许多的高级语言因此高级语言在计算机内部执行时需要将其翻译成汇编语言然后从汇编语言翻译成二进制语言因为发展过程都是要先有语言然后才有了编译器。 当对文本进行编辑工作时首先在预处理过程中系统会将头文件展开(本质是将头文件内容拷贝至源文件)、去掉文本中的注释、进行宏的替换、条件编译等。下一步进入编译工作时系统会将高级语言编译成汇编语言然后进入汇编阶段中系统将汇编语言编译成二进制文件此二进制文件称为 “可重定位目标二进制文件” 注意此时的二进制文件是不可执行的。因为此时的二进制文件还没有与高级语言中特定的库文件形成关联即没有联系而链接过程就是使用标准库文件将形成的二进制文件与高级语言标准库文件中的代码形成关联使系统能够识别其中代码的功能。
库文件 库文件是预先编译好的函数功能的集合可以将用户写好的程序打包成一个整体当其他模块或用户使用时只需要这个库文件即可不需要源代码文件。其中库文件主要分为静态库和动态库程序在使用库时使用静态链接或动态链接进行静态库或动态库的关联。Linux中静态库文件以 .a 后缀名动态库文件以 .so 后缀名Windows中静态库文件以 .lib 为后缀名动态库文件以 .dll 为后缀名。 静态库的特点是程序在编译连接的过程当中编译器从库文件中取得所需代码复制到生成的可执行文件中。因此静态库是程序在链接阶段被复制到程序当中和程序的执行过程没有关系。 动态库也称为共享库的特点是在程序运行时由系统动态加载到内存中程序在使用时直接关联。因此动态库可以被多个程序共享同时只占用一份内存空间提高了内存的使用效率。 我们可使用 ldd 指令来观察可执行文件所依赖的库文件。 [zhuzhujunhao ~]$ ldd code 查看C语言中可执行文件code所依赖的库文件 linux-vdso.so.1 (0x00007ffd9b12a000) libc.so.6 /lib64/libc.so.6 (0x00007fde6069b000) code依赖动态库/lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 (0x00007fde60a69000) /lib64/libc.so.6这个文件就是C语言标准动态库标准静态库是/lib64/libc.a因此在Linux中我们可直接使用C语言。其它语言也同理平台要支持一种语言的开发就必须要提前在系统中安装这种语言的标准头文件和库文件。
1-2预处理过程 当我们只想要查看预处理生成的内容时使用 gcc -E [目标文件] 可在直接显示预处理处理后生成的数据使用 gcc -E [目标文件] -o [文件] 这里选项不分前后顺序会将源文件处理后的数据放入 [文件] 中。当不存在 [文件] 时系统会自动创建此文件。这里的 -E 表示系统将预编译过程处理完后停止。 [zhuzhujunhao ~]$ gcc -E code.c -o code.i 将 code.c 文件经预处理后生成的数据放入 code.i 中 [zhuzhujunhao ~]$ ll total 36 -rw-rw-r-- 1 zhu zhu 89 Dec 6 08:46 code.c -rw-rw-r-- 1 zhu zhu 25606 Dec 6 08:47 code.i -rw-rw-r-- 1 zhu zhu 827 Dec 5 14:52 install.sh 在预处理过程我们可使用 -D [宏名称] 自动将宏加入源文件中在预处理阶段也会将其一并处理。这里要注意这里的指令添加只是暂时将其添加再次进入文本后可观察到没有此宏。 [zhuzhujunhao ~]$ gcc code.c -DSETVECTOR1 -o code.exe [zhuzhujunhao ~]$ ./code.exe have SETVECTOR1 可发现存在此宏 预编译过程将添加的宏进行替换但在其它阶段不可因为只有在预编译过程中才处理宏 [zhuzhujunhao ~]$ gcc -E code.c -D SETVECTOR -o code.i 因此通过以上可发现我们在系统编程的过程中我们可实现自己代码和编译器指令的动态裁剪。
1-3编译过程 当我们只想要观看编译处理后的内容时需使用 -S 选项使用方法跟预处理使用的语法和方法一样即gcc -S [目标文件] -o [文件]这里选项不分前后顺序将处理完的数据放到 [文件] 中不同的是[目标文件] 可以是C语言源文件也可以是预处理后的文件。-S 表示系统将编译过程处理完后就停止。 [zhuzhujunhao ~]$ gcc -E code.c -o code.i 预处理后的文件code.i [zhuzhujunhao ~]$ gcc -S code.c -o code.s 处理C语言源文件形成文件code.s [zhuzhujunhao ~]$ gcc -S code.i -o code.s1 处理预处理的文件形成文件code.s1 此过程结束后将会形成汇编语言即系统调用汇编编译器形成汇编语言。
1-4汇编过程 只观看汇编处理后的数据对应的选项为 -c 用法一样指令为 gcc -c [目标文件] -o [文件]这里选项不分前后顺序将汇编形成的二进制数据放入 [文件] 中其中 [目标文件] 可以是C语言源文件可以是预处理后的文件可以是编译过程中形成的汇编文件。-c 表示当系统将汇编过程处理完后就停止。 [zhuzhujunhao ~]$ gcc -c code.c -o code.o 处理C语言源文件code.c [zhuzhujunhao ~]$ gcc -c code.i -o code.o 处理预处理后的文件code.i [zhuzhujunhao ~]$ gcc -c code.s -o code.o 处理编译后的汇编文件code.s 上面的形成的 code.o 文件就是二进制文件。
1-5链接过程 链接是系统处理的最后一步这里不需要任何选项直接 gcc 编译即可即 gcc [目标文件] -o [文件] 这里选项不分前后顺序这里形成的文件就是将二进制文件与标准库文件链接后的可执行文件。这里表示的是系统直接处理 [目标文件] 形成可执行文件。 [zhuzhujunhao ~]$ gcc code.o -o code 将二进制文件code.o链接 可发现这就是我们平常直接将源文件形成可执行文件的指令。即链接指令。 链接过程中系统默认使用动态链接C语言的动态库在 /lib64/libc.so.6 文件下而C的动态库在 /lib64/libstdc.so.6 文件下其中使用 -static 可在链接时改为静态链接这里要注意的是有些系统默认可能没有安装静态库。我们需要去安装静态库安装C和C的静态库指令如下 [rootzhujunhao ~]# yum install -y glibc-static libstdc-static glibc-static 是C语言的静态库 libstdc-static是C的静态库 其中C语言安装后的静态库在 /lib64/libc.a 文件下C的静态库在 /lib64/libstdc.a 文件下。 链接过程使用静态链接指令如下 [zhuzhujunhao ~]$ gcc code.c -o code-static -static [zhuzhujunhao ~]$ ldd code-static not a dynamic executable 查看后可发现链接的不是动态库即链接静态库 g的使用都与gcc一样注意的是系统原本没有安装 g 编译器在 CentOS 版本下安装g 相关的步骤在此链接下CentOS下的g安装