贵州专业网站建设费用,常见的营销策略有哪些,搜索引擎优化seo论文,实用网站的设计与实现目录
0.程序实现的两大环境
1.gcc如何完成
预处理
编译
汇编
链接
2.动态库与静态库
对比二者生成的文件大小
3. gcc常用选项 0.程序实现的两大环境
任何一个C程序的实现都要经过翻译环境与执行环境。
在翻译环境中又分为4个部分#xff0c;预编译、编译、汇编与链…
目录
0.程序实现的两大环境
1.gcc如何完成
预处理
编译
汇编
链接
2.动态库与静态库
对比二者生成的文件大小
3. gcc常用选项 0.程序实现的两大环境
任何一个C程序的实现都要经过翻译环境与执行环境。
在翻译环境中又分为4个部分预编译、编译、汇编与链接。在各个阶段主要完成的任务有
1.预编译预处理头文件的包含、注释的删除、#define符号的替换
2.编译将C语言代码转化为汇编代码
3.汇编把汇编指令转化为二进制指令
4.链接合并符号表和段表生成可执行程序。 更多详细关于程序实现的两大环境的知识请参考程序实现的两大环境 。
1.gcc如何完成
通过gcc指令的不同选项可查看各阶段所形成的文件
格式gcc [选项] [目标文件名] -o [生成文件名]。
首先在Test.c文件中写好C代码
//Test.c
#includestdio.h#define N 100//这是一段注释.....int main()
{int n 0;printf(Hello World\n);printf(%d\n, n N);return 0;
}
预处理
查看 Test.c 预处理后的结果-E选项的作用是让 gcc 在预处理结束后停止编译过程-o 的作用是将预处理后的内容保存到 test.i 文件中。
gcc -E Test.c -o test.i 如图所示预处理阶段进行了头文件包含、注释的删除、#define的替换。
编译
接下来将刚刚生成的 test.i 进行编译并在编译之后停下来将结果写入 test.s 中。gcc所用选项为 -S。
gcc -S test.i -o test.s 我们虽然可能没学习过汇编语言但依旧隐约认识到这些就是汇编代码可见编译阶段就是将C代码翻译为汇编指令。
汇编
gcc所用选项为 -c-o 将结果写入到 test.o 中。
gcc -c test.s -o test.o 正如我们所见汇编完成之后都这这样的乱码。其实汇编之后生成的文件为二进制文件是用来给计算机看的咱们已经看不懂了。
链接
编译完成之后就进入了链接阶段链接完成之后就会生成可执程序 Test了。
gcc test.o -o Test 但是关于链接我们需要知道它在链接什么。
我们是否好奇过为什么我们明明没有定义过函数 printf 、return .....等等的函数但却可以使用它的功能
其实系统把这些函数的实现都被做到名为 libc.so.6 的库文件中去了在没有特别指定时gcc 会到系统默认的搜索路径“/usr/lib”下进行查找也就是链接到 libc.so.6 库函数中去这样就能实现函 数 printf 了而这也就是链接的作用。
2.动态库与静态库
函数库一般分为动、静态库两种。二者的区别可以理解为私有与公共的区别。就好比我们需要读一本《C和指针》有两种方法可以选。一种是自己买一本只有自己可以用用起来还挺方便缺点就是得花钱第二种是去图书馆借书图书馆的资源被所有人共享。
gcc 进行函数库的链接时可选择静态链接或者动态链接。
静态链接就类似于自己买书看只给自己看同时还费钱浪费内存静态链接时会将库文件的代码全部加入到可执行文件中因此生成的文件比较大。
动态链接类似于去图书馆借书。函数库就放在某个固定的地方哪个程序想去使用就去自己去加载它。
Linux下gcc默认使用动态链接。
对比二者生成的文件大小
//采用静态链接
gcc -static Test.c -o Test_static
//默认采用动态链接
gcc Test.c -o Test
若在静态链接时出错可能是因为你的 Linux 没有安装C语言的静态库须手动安装。
//安装C语言静态库
yum install -y glibc-static
两种连接方式生成的文件大小几乎相差百倍。 3. gcc常用选项
以下是gcc编译器常用选项汇总 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 -S 编译到汇编语言不进行汇编和链接 -c 编译到目标代码 -o 文件输出到 文件 -static 此选项对生成的文件采用静态链接 -g 生成调试信息。GNU 调试器可利用该信息 -shared 此选项将尽量使用动态库所以生成文件比较小但是需要系统由动态库. -O0 -O1 -O2 -O3 编译器的优化选项的4个级别-O0表示没有优化,-O1为缺省值-O3优化级别最高 -w 不生成任何警告信息 -Wall 生成所有警告信息。