科技公司手机端网站app公司网站模板
web/
2025/9/28 9:23:58/
文章来源:
科技公司手机端网站,app公司网站模板,深圳比较有名的外贸公司,建设部网站焊工证件查询一、 C语言编译过程 C语言的编译过程可分为四个阶段#xff1a; 1、预处理#xff08;Preprocessing#xff09; 对源程序中的伪指令#xff08;即以#开头的指令#xff09;和特殊符号进行处理的过程。 伪指令包括#xff1a;1#xff09;宏定义指令#xff1b; 2… 一、 C语言编译过程 C语言的编译过程可分为四个阶段 1、预处理Preprocessing 对源程序中的伪指令即以#开头的指令和特殊符号进行处理的过程。 伪指令包括1宏定义指令 2条件编译指令 3头文件包含指令 2、编译Compilation 编译就是将源程序转换为计算机可以执行的二进制代码。 说明 在Linux下目标文件的缺省后缀为.o 编译程序将通过词法分析和语法分析将其翻译成为等价的汇编代码。 在使用gcc进行编译时缺省情况下不输出这个汇编代码的文件。如果需要可以在编译时指定-S选项。这样就会输出同名的汇编语言文件。 3、汇编Assembly 汇编的过程实际上是将汇编语言代码翻译成机器语言的过程。 产生一个扩展名为.o的目标文件。 4、链接Linking 目标代码不能直接执行要想将目标代码变成可执行程序还需要进行链接操作。才会生成真正可以执行的可执行程序。 链接操作最重要的步骤就是将函数库中相应的代码组合到目标文件中。 二、文件名后缀 gcc可以针对支持不同的源程序文件进行不同的处理文件格式以文件的后缀来识别。 文件名后缀 文件类型 .c C源文件 .C .cpp .cc .c .cxx C源文件 .h 头文件 .i 预处理后的C源文件 .s 汇编程序文件 .o 目标文件 .a 静态链接库 .so 动态链接库 三、 gcc编译器简介 gccGNU Compiler Collection 在Linux平台上最常用的C语言编译系统是gcc它是GNU项目中符合ANSI C标准的编译系统。 gcc的使用格式 gcc [options][filenames] 说明当不用任何选项时gcc将会生成一个名为a.out的可执行文件。 例子在linux上编译一个c程序文件名为hello.c 执行gcc hello.c。 #include stdio.h int main() { printf(hello world.\n); return 0; } 运行编译好的可执行c文件命令是./a.out 四、gcc编译器的工作过程 1、预处理Preprocessing 2、编译Compilation Assembly 源代码转换为汇编语言在编译时选择-S选项可以看到生成的汇编代码.s文件 汇编代码.s转换为目标代码.o 3、链接Linking 将目标代码与各库函数进行链接并重定位生成可执行程序。 五、gcc命令行选项 1、预处理选项 选项 说明 -D name 定义一个宏name并可以指定值 -I dir 指定头文件的路径dir。先在指定的路径中搜索要包含的头文件若找不到则在标准路径/usr/include/usr/lib及当前工作目录上搜索。 -E 只对文件进行预处理不进行编译、汇编、链接生成的结果送标准输出 即只运行C预编译器 -o file 将输出写到指定的文件file中 即产生目标.i 、.s 、 .o 、可执行文件等 例子使用 -I选项包含保存在非标准位置中的头文件。 # gcc -I/usr/openwin/include file.c 例子使用-D选项定义宏其作用等价于在源文件中使用宏定义指令。 main() { printf(display -D variable %s\n,DOPTION); printf(hello,everybody!!\n); } # gcc -D DOPTIONtesting -D hello.c 2、编译程序选项 选项 说明 -o file1 file2 将文件file2编译成可执行文件file1。 如果未使用该选项则可执行文件放在a.out中 -S 只进行编译不进行汇编生成汇编代码文件扩展名为.s 即告诉编译器产生汇编语言文件后停止编译 -c 只把源文件编译成目标代码.o不进行汇编、链接。 用于实现对源文件的分别编译 -g 在目标代码中加入供调试程序gdb使用的附加信息 -v 显示gcc版本 -Wall 显示警告信息 例子在gcc中使用-W控制警告信息。 # gcc -Wall -o hello1 hello1.c 例子使用gcc的-g选项来产生调试符号 # gcc -g -o test1 test1.c 例子多文件的编译。 //meng1.c #include stdio.h main() { int r; printf(enter an integer,please!\n); scanf(%d,r); square(r); return 0; } //meng2.c #include stdio.h int square(int x) { printf(The square%d\n,x*x); return (x*x); } 编译方法一 # gcc -c meng1.c # gcc -c meng2.c # gcc meng1.o meng2.o -o meng12 编译方法二 # gcc -o meng13 meng1.c meng2.c 说明 方法二不产生中间目标文件直接生成一个可执行文件因而程序内容稍有改动就要重新编译全部程序。 3、优化程序选项 优化是编译器的一部分它可以检查和组合编译器生成的代码指出未达到最优的部分并重新生成它们从而使用户编写的程序更加完美且节省空间。 在gcc编译器选项中使用-O选项对代码进行优化。 优化级别分3级由高到低分别为-O3、-O2、-O1 优化程序选项 选项 说明 -O1(-O) 对编译出的代码进行优化 -O2 进行比-O高一级的优化 -O3 产生更高级别的优化 说明 -O1或-O、-O2、-O3分别代表优化级别数字越高代表gcc的优化级别越高高的优化级别代表着程序将运行的更快。 优化级别越高则程序量越大。 直接优化程序本身性能的提高的变化更加明显。 4、连接程序选项 库是一组预先编译好的函数集合。 说明 标准库文件一般存储在/lib和/usr/lib目录中。 所有的库名都以lib开头。例如libc.so标准C语言函数库、libm.so数学运算函数库 以.a结尾的是静态库以.so结尾的库是动态库。 使用ar工具将目标文件收集起来放到一个归档文件中。 连接程序选项 选项 说明 -L dir 将dir所指出的目录加到“函数库搜索列表”中 -llib 链接lib库 -I name 连接时加载名字为name的函数库。该库位于系统预设的目录或者由-L选项确定的目录下。 实际的库名是libname后缀为.a或.so 说明 链接过程通常的形式如下 gcc -o file file.o -L dirname -lxxx -L指定了链接时用到的库文件所在的目录。 -lxxx指示链接的库函数名为libxxx.a 例子编译产生可执行文件hello搜索数学库以解决问题。 # gcc -o hello hello.c /usr/lib/libm.a 或者 # gcc -o hello hello.c -lm 例子创建一个小型库 包含两个函数pro1、pro2然后在示例程序中调用其中一个函数。 /* pro1.c */ #include stdio.h void pro1(int arg) { printf(hello:%d\n, arg); } /* pro2.c */ #include stdio.h void pro2(char *arg) { printf(welcome to:%s, arg); } /* lib.h */ void pro1(int); void pro2(char *); /* program.c */ #include lib.h int main() { pro2(Linux world.); exit(0); }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83254.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!