Linux(程序设计):05---gcc的基本用法

Posted 董哥的黑板报

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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完成命令的其它程序成为“翻译官”

三、演示案例


  • gcc  hello.c

不加任何参数时,会生成a.out可执行二进制文件




  • gcc  -c  hello.c ​  //默认生成hello.o文件
  • gcc  -c -o hello.o hello.c ​ //指定生成hello.o文件



  • gcc  -g -o hello hello.c ​ //生成hello可执行文件,顺便加上gdb可调试的符号表



  • gcc  -o  hello  hello.o ​  //链接指定生成hello可执行文件



  • gcc  -o  thank  thank1.o  thank2.o​   //通过thank1.o与thank2.o链接成一个thank文件




  • gcc  -Wall  -c  hello.c​  //以最严格的方式生成.o文件时,有警告会发出警告
  • gcc  -O  -c  hello.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 hello  hello.c  -I/usr/include​   //生成hello执行文件时,指定头文件包含目录/usr/include



-D宏定义参数的验证:

#include <stdio.h> int main() #ifdef ABC printf("define ABC\\n"); #endif printf("HelloWorld\\n"); return 0;

  • 使用-D参数 :

Linux(程序设计):05---gcc的基本用法_gcc的使用

  • 不使用-D参数:

Linux(程序设计):05---gcc的基本用法_gcc的使用_02



生成动态库文件

gcc -fPIC -shared myLib.c -o myLib

四、gcc编译时内部的翻译官介绍(-v选项)

我们先用gcc -v -o hello hello.c来直接一步生成可执行文件。在下图中,内容如下


  • 红色以上的是gcc的版本打印信息,不用去管
  • 在下面的三个红框中,分别是gcc编译时调用的系统的其它3个翻译官,gcc调用它们分别来完成编译、汇编、链接

Linux(程序设计):05---gcc的基本用法_gcc的使用_03


如果将上述步骤分开来,分别是:


  • 编译:/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1   -o  /tmp/ccQk6lPl.s  hello.c
  • 汇编:as   -o  /tmp/ccIFnLna.o   /tmp/ccQk6lPl.s
  • 链接:/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2  -o  hello   /tmp/ccIFnLna.o+一些其他的.o



以上是关于Linux(程序设计):05---gcc的基本用法的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习第三节课-指令基本概念及部分指令用法

linux 详解useradd 命令基本用法

Vi/Vim基本用法

nohup命令的用法

linux基本指令的使用。cdls文件查看wc历史命令调命令用法查询通配符

LinuxGCC程序开发工具(上)