[转]GCC使用手册及常用命令行

一、GCC功能介绍

GCC编译器完成从C、C++、objective-C等源文件向运行在特定CPU硬件上的目标代码的转换(这是任何一个编译器需要完成的任务)。

GCC能够处理的源文件分为C、C++、Objective-C、汇编语言等。对于这些源文件,用他们的后缀名进行标示。GCC能够处理的后缀有:

a. *.c  *.C      (C语言)

b. *.cxx   *.cc  (C++语言)

c. *.m           (面向对象的C)

d. *.i           (预处理后的C语言源文件)

e. *.ii          (预处理后的C++语言源文件)

f. *.s *.S       (汇编语言)

h. *.h         (头文件)

目标文件可以是:

a. *.o     编译连接后的目标文件

b. *.a     库文件

编译器把编译生成目标代码的任务分为以下4步:

1)预处理,把预处理命令扫描处理完毕;

2)编译,把预处理后的结果编译成汇编或者目标模块;

3)汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;

4)连接,把多个目标代码模块连接生成一个大的目标模块;

二、GCC开关

GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。

2.1全局开关(OVERALL OPTIONS)

全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在 某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。

1、–x  language

对于源文件是用什么语言编写的,可以通过文件名的后缀来标示,也可以用这开关。指定输入文件是什么语言编写的,language 可以是如下的内容

1)c

2)objective-c

3)c-header

4)c++

5)cpp-output

6)assembler

7)assembler-with-cpp

2、–x none   把上一节介绍的-x开关都给关掉了。

3、–c 编译成把源文件目标代码,不做连接的动作。

4、–S 把源文件编译成汇编代码,不做汇编和连接的动作。

5、–E 只把源文件进行预处理之后的结果输出来。不做编译,汇编,连接的动作。

6、–o file 指明输出文件名是file。

7、–v 把整个编译过程的输出信息都给打印出来。

8、–pipe

由于gcc的工作分为好几步才完成,所以需要在过程中生成临时文件,使用-pipe就是用管道替换临时文件。

2.2语言相关开关(Language Options) :用来处理和语言相关的控制开关。

1、–ansi

这个开关让GCC编译器把所有的gnu的编译器特性都给关掉,让你的程序可以和ansi标准兼容。     除了以上的开关外,语言相关开关还有很多。

2.3用来控制预处理所设置的开关。

1、–include file

在编译之前,把file包含进去,相当于在所有编译的源文件最前面加入了一个#include <file>语句。

2、–imacros file

同-include file 一样。不过这个文件在具体编译的时候只有里面定义的宏才起作用,所以值用来在file文件里面定义宏。

3、–nostdinc

在搜寻include 的文件路径中去掉标准的c语言头文件搜索路径,例如stdio.h文件就是放在标准头文件搜索路径下。

4、–nostdinc++     同上,只是去掉的是标准C++语言的头文件搜索路径。

5、–C     同-E参数配合使用。让预处理后的结果,把注释保留,让人能够比较好读它。

6、–Dmacro     把macro定义为字符串’1’。

7、–Dmacro = defn    把macro定义为defn。

8、–Umacro     把对macro的定义取消。

2.4汇编开关(Assembler Option) :用来控制汇编行为的开关。

1、–Wa , option

把option作为开关送给汇编程序。如果option里面有逗号,则作为好几行进行处理。

2.5连接开关(Linker Options) :用来控制连接过程的开关选项。

1、object-file-name

2、–llibrary     连接库文件开关。例如-lugl,则是把程序同libugl.a文件进行连接。

3、–lobjc     这个开关用在面向对象的C语言文件的库文件处理中。

4、–nostartfiles     在连接的时候不把系统相关的启动代码连接进来。

5、–nostdlib     在连接的时候不把系统相关的启动文件和系统相关的库连接进来。

6、–static     在一些系统上支持动态连接,这个开关则不允许动态连接。

7、–shared     生成可共享的被其他程序连接的目标模块。

2.6目录相关开关(Directory Options) :用于定义与目录操作相关的开关。

1、–Idir     宏include需要搜寻的目录。

2、–I-     与-I开关类似。

3、–Ldir     搜寻库文件(*.a)的路径。

2.7 警告开关(Warning Options) :与警告处理相关的开关。

1、–fsyntax-only     只检查代码中的语法错误,但并没有输出。

2、–w     禁止一切警告信息打印出来。

3、–Wno-import     禁止对宏#import提出警告。

4、–pedantic

5、–pedantic-errors

6、–W

2.8 调试开关(Debugging Options)

1、–g     把调试开关打开,让编译的目标文件有调试信息。

2.9 优化开关(Optimization Options)

-O1 –O2 –O3 –O0,这些开关分别控制优化的强度,-O3最强。

2.10 目标机开关(Target Options)

1、–b machine

在有的时候,Gcc编译器编译出来的目标代码并不是在运行这个编译动作的机器上运行而是另外一台机器,这种编译叫做交叉编译,用来运行最终目标代码的得机器叫做目标机,machine就是用来指明目标机的类型的。

2、–V version     用来告诉编译器使用它的多少版本的功能,version参数用来表示版本。

2.11 CPU相关开关(Machine Dependent Options) :比较多,也是在交叉编译的时候用得着。

三、GCC 使用指南

1、使用语法:

  gcc [ option | filename ]…

  g++ [ option | filename ]…

  其中option为gcc使用时的选项(后面会再详述), 而filename为欲以gcc处理的文件

说明: 这 C 与 C++ 的 compiler 已将产生新程序的相关程序整合起来。产生一个新的程序需要经过四个阶段:预处理、编译、汇编、连结,而这两个编译器都能将输入的文件做不同阶段的处理。虽然原始程序的扩展名可用来分辨编写原始程序码所用的语言,但不同的compiler,其预设的处理程序却各不相同:

1)gcc  预设经由预处理过(扩展名为.i)的文件为 C 语言,并於程式连结阶段以 C 的连结方式处理。

2)g++  预设经由预处理过(扩展名为.i)的文件为 C++ 语言,并於程序连结阶段以 C++ 的连结方式处理。

2、原始程序码的扩展名指出所用编写程序所用的语言,以及相对应的处理方法:

  .c  C 原始程序          ;   预处理、编译、汇编

  .C  C++ 原始程序        ;   预处理、编译、汇编

  .cc   C++ 原始程序        ;   预处理、编译、汇编

  .cxx  C++ 原始程序        ;   预处理、编译、汇编

  .m  Objective-C 原始程序    ;   预处理、编译、汇编

  .i  已经过预处理之 C 原始程序  ;   编译、汇编

  .ii   已经过预处理之 C++ 原始程序 ;   编译、汇编

  .s  组合语言原始程序      ;   汇编

  .S  组合语言原始程序      ;   预处理、汇编

  .h  预处理文件(标头文件)    ;   (不常出现在指令行)

其他扩展名的文件是由连结程序来处理,通常有:

  .o  Object file

  .a  Archive file

3、除非编译过程出现错误,否则 “连结” 一定是产生一个新程序的最後阶段。然而你也可以以 -c、-s 或 -E 等选项,将整个过程自四个阶段中的其中一个停止。在连结阶段,所有与原始码相对应的.o文件、程序库、和其他无法自文件名辨明属性的文件(包括不以.o  为扩展名的 object file 以及扩展名为 .a 的 archive file)都会交由连结程序来处理(在指令行将那些文件当作连结程序的参数传给连结程序)。

4、选项:

  1)不同的选项必须分开:例如 `-dr’ 这个选项就与 `-d -r’ 大不相同。

2)绝大部份的 `-f’ 及 `-W’ 选项都有正反两种形式:-fname 及-fno-name (或 -Wname 及 -Wno-name)。以下只列出非预设的那个形式。

  3)一般性(概略、常用的)选项:-c -S -E -o file -pipe -v -x language

文件说明

  file.c       C source file

  file.h       C header (preprocessor) file

  file.i       经预处理过的 C source file

  file.C       C++ source file

  file.cc      C++ source file

  file.cxx    C++ source file

  file.m       Objective-C source file

  file.s       assembly language file

  file.o       object file

  a.out        link edited output

  TMPDIR/cc*     temporary files

  LIBDIR/cpp     preprocessor

  LIBDIR/cc1     compiler for C

  LIBDIR/cc1plus   compiler for C++

  LIBDIR/collect   linker front end needed on some machines

  LIBDIR/libgcc.a  GCC subroutine library

  /lib/crt[01n].o  start-up routine

  LIBDIR/ccrt0  additional start-up routine for C++

  /lib/libc.a    standard C library, 参阅 man page intro(3)

  /usr/include  standard directory for #include files

  LIBDIR/include   standard gcc directory for #include files

  LIBDIR/g++-include additional g++ directory for #include

  LIBDIR is usually /usr/local/lib/machine/version.

  TMPDIR comes from the environment variable TMPDIR (default

  /usr/tmp if available, else /tmp).

四、简易命令参数汇总

-o FILE

指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.

-c 只编译不链接

-DFOO=BAR 在命令行定义预处理宏FOO,其值为BAR

-IDIRNAME 将DIRNAME加入到头文件的搜索目录列表中

-LDIRNAME 将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库

-static 链接静态库,即执行静态链接

-lFOO 链接名为libFOO的函数库

-g 在可执行程序中包含标准调试信息

-ggdb 在可执行程序中包含只有GNU debugger才能使别的达两条是信息

-O 优化编译过的代码

-ON 指定代码优化的级别为N,o<=N<=3

-ansi 支持ANSI/ISO C的标准语法,取消GNU的语法扩展中与该标准有冲突的部分

(但这一选项并不能保证生成ANSI兼容的代码)

-pedantic 允许发出ANSI/ISO C标准所列出的所有警告

-pedantic -errors 允许发出ANSI/ISO C标准所列出的所有错误

-traditional 支持Kernighan & Ritchie C语法(如用旧式语法定义函数);如果不知道这个选项的含义,也没有关系

-w  关闭所有警告,建议不要使用此项

.Wall 允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告

-werror 把所有警告转换为错误,以在警告发生时中止编译过程

-MM 输出一个make兼容的相关列表

-v 显示在编译过程的每一步中用到的命令

-lpthread 编译多线程程序

时间: 2024-10-02 18:43:28

[转]GCC使用手册及常用命令行的相关文章

Gcc常用命令行

本篇文章摘自 http://blog.csdn.net/ljzcom/article/details/7213101 对于Gcc自带的很多命令行,只有具体编程里面用到了或者看到别人真真用到的,用的目的很清楚,才有价值记录下来,常用的记在脑子里面,这就够了.对于Linux基本编程工具的总结,之前都是总结在有道云笔记里面,觉的,那里面的太封闭了,写的好不好,只有自己知道.自己一直秉持着技术开放的心态,能够清晰的讲解出来的技术,才是你真正消化吸收的东西. Gcc功能介绍 Gcc编译器完成从原始的C.C

Linux - 常用命令行(一)

今天和大家分享一些最基本常用命令行:也是作为新手最应该了解掌握的 ls 命令:用来显示指定工作目录下内容 dir命令:与ls命令一致 cd  命令:变化工作目录 pwd命令:显示用户当前的工作路径,显示出完整的当前活动目录名称 clear 命令:清屏命令 man 命令:查看指定命令help信息 mkdir 命令:用来创建新目录 rmdir 命令: 用来删除已建立的目录 rm 命令:删除文档及目录 touch 命令: 创建一个空白的文件 或 改变一个文件的时间戳 cp 命令:复制文件(或目录) m

Mysql常用命令行大全——转载

转载地址:http://www.blogjava.net/supperchen/archive/2012/10/11/389340.html 第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,然后回车即可进入到mysql中了,mysql的提示符是: mysql> 注意,如果是连接到另外的机器上,则

jdk自带常用命令行工具使用

下面是笔者整理的jdk自带的常用命令行工具的使用方法,全部原创,转载请注明出处,并贴上链接,谢谢! jps命令使用 jstat命令使用 jinfo命令使用 jmap命令使用 jhat命令使用 jstack命令使用 jcmd命令使用

Linux 操作MySQL常用命令行

Linux 操作MySQL常用命令行 注意:MySQL中每个命令后都要以分号:结尾. 1.显示数据库 mysql> show databases; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.04 sec) Mysql刚安装完有两个数据库:mysql和test.mysql库非常重要,它里面有MySQL的系统信息,我们改密码和新增用户,实际上就是用这个库中的相关表进行

rabbitmq常用命令行汇总

最近处理openstack问题时,碰到了rabbitmq相关的问题,使用相关命令行时,经常去现找相关的帖子,感觉很麻烦,记录下自己定位问题时,用到的一些常用命令行,方便以后问题的查找 1)常用的一些查询和设置命令行 rabbitmqctl list_queues:查看所有队列信息 rabbitmqctl stop_app:关闭应用(关闭当前启动的节点) rabbitmqctl start_app:启动应用,和上述关闭命令配合使用,达到清空队列的目的 rabbitmqctl reset:从管理数据

linux 常用命令行

linux 常用命令行(持续更新) 1.使用pid查询端口号 sudo netstat -antup|grep PID号 2.查询端口号所有情况 sudo netstat -antup    3.启动.重启.关闭tomcat服务器,若没有权限则加sudo service tomcat6 start service tomcat6 restart service tomcat6 stop 4.查看防火墙情况 chkconfig --list |grep -i iptables 原文地址:https

MySQL命令大全:MySQL常用命令手册、MySQL命令行大全、查询工具

1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql> 2.连接到远程主机上的MYSQL.假设远程主机的IP为:11

vi 常用命令行

1.vi 模式  a) 一般模式: vi 处理文件时,一进入该文件,就是一般模式了.  b) 编辑模式:在一般模式下可以进行删除,复制,粘贴等操作,却无法进行编辑操作.等按下‘i,I,o,O,a,A,r,R’等          字母之后才能进入编辑模式.通常在linux中,按下上述字母时,左下方会出现'INSERT'或者‘REPLACE’字样,才可以          输入任何文字到文件中.要回到一般模式,按下[ESC]键即可.  c) 命令行模式:在一般模式中,输入“: 或者/或者?”,即可