gcc是GUN C和C++编译器,我们通常使用GCC时,编译器会依次做如下工作:preprocess(预处理),compilation(编译),assembly(汇编),link(链接)。gcc提供了一些选项参数能够让编译器停在某个过程(如编译过程),比如 -c选项表示只走到“汇编”这一步,生成的是汇编后的目标文件。本文主要介绍gcc常用的选项参数及其作用。
1.-c 对源代码进行预处理、编译、汇编,但不执行链接,产生的是源代码的目标文件(*.o)

jie$ vi test.c
jie$ cat test.c
#include <stdio.h>
#define PI  3.14
int main()
{printf("%f\n",PI);return 0;
}
jie$ gcc -c test.c
jie$ ls
test.c  test.o

2.-S 对源代码进行预处理、编译,不执行汇编、链接工作,有时我们想查看源代码的汇编代码,可以通过-S 选项实现。

jie$ cat test.c
#include <stdio.h>
#define PI  3.14
int main()
{printf("%f\n",PI);return 0;
}
jie$ gcc -S test.c
jie$ ls
test.c  test.s
jie$ file test.s
test.s: assembler source, ASCII text
jie$ cat test.s.file   "test.c".section    .rodata
.LC1:.string "%f\n".text.globl  main.type   main, @function
main:
.LFB0:.cfi_startprocpushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp.cfi_def_cfa_register 6subq    $16, %rspmovabsq $4614253070214989087, %raxmovq    %rax, -8(%rbp)movsd   -8(%rbp), %xmm0movl    $.LC1, %edimovl    $1, %eaxcall    printfmovl    $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size   main, .-main.ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609".section    .note.GNU-stack,"",@progbits

3. -E 仅对源代码进行预处理(比如替换宏),这个选项不会像之前一样产生一个文件,而是直接将结果输出到屏幕。

jie$ cat test.c
#include <stdio.h>
#define PI  3.14
int main()
{printf("%f\n",PI);return 0;
}
jie$ gcc -E test.c
.......
.......
.......
int main()
{printf("%f\n",3.14);return 0;
}   

可以通过重定向将结果定向到文件。

jie$ gcc -E test.c > test.e

4.-D 定义宏,与源代码中#define指令定义的宏效果一样。

jie$ cat test.c
#include <stdio.h>
int main()
{printf("%f\n",PI);return 0;
}
jie$ gcc -DPI=3.14 -o my_test  test.c
jie$ ./my_test
3.140000

5.-v 将编译过程中运行细节显示在屏幕上(错误输出stderr),可以将编译器的每步工作细节都展现出来。

jie$ gcc -v -o my_test test.c
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
COLLECT_GCC_OPTIONS='-v' '-o' 'my_test' '-mtune=generic' '-march=x86-64'/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -quiet -v -imultiarch x86_64-linux-gnu test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccddEK9Q.s
GNU C11 (Ubuntu 5.4.0-6ubuntu1~16.04.4) version 5.4.0 20160609 (x86_64-linux-gnu)compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=96 --param ggc-min-heapsize=124542
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:/usr/lib/gcc/x86_64-linux-gnu/5/include/usr/local/include/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/usr/include/x86_64-linux-gnu/usr/include
End of search list.
GNU C11 (Ubuntu 5.4.0-6ubuntu1~16.04.4) version 5.4.0 20160609 (x86_64-linux-gnu)compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=96 --param ggc-min-heapsize=124542
Compiler executable checksum: 78b6f8b2ed219a71c67c16db887e4800
COLLECT_GCC_OPTIONS='-v' '-o' 'my_test' '-mtune=generic' '-march=x86-64'as -v --64 -o /tmp/ccbIpzZI.o /tmp/ccddEK9Q.s
GNU assembler version 2.26.1 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.26.1
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'my_test' '-mtune=generic' '-march=x86-64'/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccDLPQRA.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o my_test /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. /tmp/ccbIpzZI.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

6**.-Wall 使GCC产生尽可能多的警告信息**
警告信息虽然不能算作错误,但却很可能成为错误的来源。一个好的程序员应该尽量避免产生警告信息,使自己的代码始终保持标准、健壮。所以应将警告信息当成编码错误来对待。
如果在编译程序时带上-Werror选项,那么GCC会在产生警告时停止编译

gcc -Wall -o test test.c
gcc -Werror -o test test.c 

7.-I 指定头文件包含目录

jie$ tree .
.
├── header
│   └── add.h
├── source
│   └── add.c
└── test.c
jie$ cat test.c
#include <stdio.h>
#include "add.h"
#define PI  3.14
int main()
{printf("%f\n",PI);printf("%d\n",add(6,8));return 0;
}
jie$ cat ./header/add.h
int add(int a,int b);
jie$ cat ./source/add.c
int add(int a,int b)
{return a+b;
}
jie$ gcc test.c ./source/add.c
test.c:2:17: fatal error: add.h: No such file or directory
compilation terminated.
jie$ gcc -I ./header/ test.c ./source/add.c
jie$ ls
a.out  header  source  test.c
jie$ a.out
3.140000
14

8. -L 指定库文件目录,假定在/home/jie/lib目录下动态库文件libadd.so和静态库文件libadd.a。

$ gcc -o my_test –L /home/jie/lib -static –ladd –o foo test.c

-l选项指示GCC去链接静态库文件libadd.a。Linux下的库文件命名有一个约定,即库文件以lib三个字母开头,因为所有的库文件都遵循这个约定,故在用-l选项指定链接的库文件名时可以省去lib三个字母。Linux下的库文件分为动态链接库(.so文件)和静态链接库(.a文件)。GCC默认为动态库优先,若想在动态库和静态库同时存在的时候链接静态库需要指明为
-static选项。
这里顺便补充一下库链接时搜索路径顺序:
静态库:
1. ld会先搜索GCC命令中-L指定的目录
2. 再搜索gcc的环境变量LIBRARY_PATH
3. 再搜索目录 /lib /usr/lib /usr/local/lib
动态库:
1. 编译目标代码时-L指定的目录
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
9.-std= 指定语言标准

$ gcc -o my_test -std=c90 test.c
jie$ ls
my_test  test.c
jie$ ./my_test
3.140000

10.代码优化选项
GCC提供不同等级的代码优化功能。开关选项是:-On,n取值为0到3。默认为1。-O0表示没有优化,而-O3是最高优化。优化级别越高代码运行越快,但并不是所有代码都能够加载最高优化,而应该视具体情况而定。但一般都使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较好的平衡点。

gcc命令常用选项参数详解相关推荐

  1. JVM之常用基础参数详解

    JVM之常用基础参数详解 目录 常用基础参数内存Xms,Xmx讲解 常用基础参数栈内存Xss讲解 常用基础参数元空间MetaspaceSize讲解 常用基础参数PrintGCDetails回收前后对比 ...

  2. python u_对python 命令的-u参数详解

    缘起: 今天在看arcface的训练代码,在shell脚本中运行python 命令时后面加了-u 参数(python -u xx.py),于是对这个参数进行了下小研究. 准备知识 用网上的一个程序示例 ...

  3. GCC常用选项使用详解

    通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码.GCC是 ...

  4. g++编译命令使用以及参数详解

    gcc & g++现在是gnu中最主要和最流行的c & c++编译器 . g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c.这时候命令换做gcc即可.其实是无关紧要的. ...

  5. 实用的GCC Makefile语法及参数详解

    二话不说,先上一个Makefile的源码. 基于下述的Makefile,可以直接执行命令: 编译: make   or   make -f Makefile all 清除: make clean  o ...

  6. Redis常用配置参数详解及查看修改命令

    目录 Redis常用配置参数 Redis配置参数查看命令 语法 举例 说明: Redis配置参数修改命令 语法 举例 说明: Redis常用配置参数 序号 配置项 说明 1 daemonize no ...

  7. wget命令使用及参数详解

    文章目录 1.命令格式: 2.命令功能: 3.命令参数 启动参数 记录和输入文件参数 下载参数 目录参数 HTTP 选项参数 FTP 选项参数 递归下载参数 递归下载中的包含和不包含(accept/r ...

  8. Linux: Top命令查询结果参数详解

    1.top  -H -p 16482  (某个进程内部线程的运行情况) 整体统计信息 第一行:系统运行状态和平均负载 ​第一个参数:目前的时间 :10:14分 ​第二个参数:系统目前运行的时间:运行了 ...

  9. linux的tar命令之-N参数详解

    背景: 一次下载文件太多,服务器禁止,需要先压缩打包一下. 难点: 该文件夹下每次文件都会更新,随时增加,而且会慢慢增多,不能每次都打包全部啊 过程: 1.先用tar --help找到有个-N的参数可 ...

最新文章

  1. python用中文怎么说-如何实现python设置中文界面?
  2. ORACLE查询语句简单实例
  3. python格式化字符串_Python笔记7:三种方式构建字符串-格式化
  4. jacascript AJAX 学习
  5. 定义一个泛型为String类型的List集合,统计该集合中每个字符 (注意,不是字符串)出现的次数。例如:集合中有”abc”、”bcd”两个元素, 程序最终输出结果为:
  6. SCU 4445 Right turn(dfs)题解
  7. 怎么判断我选了多少个复选框_7~8个月宝宝一天吃多少辅食,怎么安排?妈妈这样做,养出健康娃...
  8. navicat mysql server has gone away_Navicat中MySQL server has gone away错误怎么办【转载】
  9. linux命令快速手记 — 让手指跟上思考的速度(四)
  10. Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (高级)
  11. 干货收藏 | Python语音识别终极指南
  12. No toolchains found in the NDK toolchains folder for ABI with prefix:XXX
  13. 19|雨季来临,聊些轻松的吧
  14. Zynga公布2019年第三季度财务业绩
  15. 学习强国十年磨剑最新分数及排名
  16. MoCo v1 文献研究 [自监督学习]
  17. Python数据可视化库Matplotlib折线图(一)
  18. 西安python招聘信息_中软国际(陕西西安)2017招聘启事
  19. 内核空间:kmalloc vmalloc 用户空间:malloc ptmalloc
  20. 数据泄露是如何发生的?有哪些预防措施...

热门文章

  1. [附源码]Java计算机毕业设计SSM大学生体检管理系统
  2. 第5节 Labview读取excel问题及解决办法
  3. 虚幻4能够救《仙剑奇侠传》么?
  4. 如何在 Python 中删除文件或文件夹?
  5. 什么是工业机器人的运动轴
  6. HIT软件构造-学习心得
  7. 调研发现,近30年来中国ICT产业发展关键是产业良好的营商环境
  8. 世界五百强的人力资源面试--很精彩
  9. [jOOQ中文] 七个步骤快速入门
  10. KMS激活方案(一)