要须心地收汗马,孔孟行世目杲杲。这篇文章主要讲述Linux(程序设计):05---gcc的基本用法相关的知识,希望能为你提供帮助。
一、相关选项
- ?-c:?编译生成目标文件(object file),即.o文件
- ?-o :?后面接文件名,用来指定gcc生成的文件名,如果没有-o,那么生成的是gcc默认的文件名
- ?-g:?产生符号调试工具(gdb)所必要的符号资讯(符号表),要想对源代码进行调试,就必须加入这个选项
- ?-Wall:?以最高级别使用GNU编译程序,专门用于显示警告信息
- ?-O/-O1:?对程序进行优化编译、链接,这样产生的可执行文件的执行效率可以提高。但是编译。链接的速度可能会变慢
- ?-O2:?比-O/-O1更好的优化
- ?-O3:?比-O2更好的优化
- ?-O0:?指定不优化
- ?-D:?后面跟宏定义,在编译时在代码中加上此宏定义
- ?-I(大写的i):?后面接程序使用到的头文件的指定路径
- ?-L:?后面接程序中使用到的函数库的目录(一般用来指定非系统的函数库)
- ?-l(小写的L):?后面接指定函数库的名称,一般与-L成对出现
- ?-v:?会显示gcc的版本或gcc具体执行的内容
- ?-E:?用来通过.c文件预处理的.i文件
- ?-S:?用来将.c/.i文件生成汇编文件(.s)
- ?-fPIC-shared:?编译生成动态库文件
- 其实gcc对程序的预处理、编译、汇编、链接并不是自己完成的,而是调用系统中其它的程序来完成的,下面的四中有演示案例
- gcc在使用的过程中,帮助gcc完成命令的其它程序成为“翻译官”
四、gcc编译时内部的翻译官介绍(-v选项)我们先用gcc -v -o hello hello.c来直接一步生成可执行文件。在下图中,内容如下
不加任何参数时,会生成a.out可执行二进制文件
- ?gcchello.c?
- ?gcc-chello.c ?//默认生成hello.o文件
- ?gcc-c -o hello.o hello.c ? //指定生成hello.o文件
- ?gcc-g -o hello hello.c ? //生成hello可执行文件,顺便加上gdb可调试的符号表
- ?gcc-ohellohello.o ?//链接指定生成hello可执行文件
【Linux(程序设计):05---gcc的基本用法】
- ?gcc-othankthank1.othank2.o?//通过thank1.o与thank2.o链接成一个thank文件
- ?gcc-Wall-chello.c?//以最严格的方式生成.o文件时,有警告会发出警告
- ?gcc-O-chello.c?//以最佳化的方式生成.o文件
- ?gcc-o hello hello.c-L/usr/lib ?//生成hello执行文件时,指定函数库的搜索目录/usr/lib
- ?gcc-o hello hello.c-L/usr/lib-lqt?//生成hello执行文件时,指定函数库的搜索目录/usr/lib和函数库qt(qt函数库在/usr/lib目录内,所以没有使用绝对路径)
- ?gcc-o hellohello.c-I/usr/include?//生成hello执行文件时,指定头文件包含目录/usr/include
-D宏定义参数的验证:
#include < stdio.h> int main()#ifdef ABC printf("define ABC\\n"); #endifprintf("HelloWorld\\n"); return 0;
- ?使用-D参数 :?
文章图片
- ?不使用-D参数:?
文章图片
生成动态库文件
gcc -fPIC -shared myLib.c -o myLib
- 红色以上的是gcc的版本打印信息,不用去管
- 在下面的三个红框中,分别是gcc编译时调用的系统的其它3个翻译官,gcc调用它们分别来完成编译、汇编、链接
文章图片
如果将上述步骤分开来,分别是:
- 编译:/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1-o/tmp/ccQk6lPl.shello.c
- 汇编:as-o/tmp/ccIFnLna.o/tmp/ccQk6lPl.s
- 链接:/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2-ohello/tmp/ccIFnLna.o+一些其他的.o
推荐阅读
- Linux(程序设计):02---make与Makefile的设计与应用
- Linux(程序设计):06---动态函数库与静态函数库(ldconfigldd命令与/etc/ld.so.conf)
- 服务/软件管理(06---Linux查看主机路由(route命令))
- Circle Linux镜像在阿里云镜像站首发上线
- 服务/软件管理(07---Linux下查看MAC与ARP table(arp命令))
- 服务/软件管理(10---Linux的网卡(ethtool命令))
- Linux-find命令
- Linux(程序设计):41---TCP网络编程
- Linux中yum和apt-get