User Tools

Site Tools


tech:gnu:gcc

GCC备忘录

首先,向Richard Stallman大叔致敬! 我们可以不完全赞成他那带有共产主义色彩的自由软件理念,但我们不能不为他那种不懈追逐自由的精神所感动,更不能不为在工作过程中能够自由使用这么多好得要命的GNU工具而心存感激。

1. GCC是GNU Compiler Collection的缩写,我们不能因为它包含了两个C便认为它只是一个C编译器,它几乎支持当前所有使用中的计算机语言。

2. 基本选项

  • –version

查看简单的版本信息,如GCC 3.4.3,请略微注意一下那条信息“Copyright (C) 2004 Free Software Foundation, Inc. This is free software; ”

  • -v

显示编译生成当前使用的GCC时所采用的配置信息,据此可以获取当前GCC所支持的选项。

  • -print-search-dirs

显示可执行程序和静态链接库的搜索路径。

  • -o filename

显式指定输出文件。

3. 基本C/C++选项

  • -c

只编译,不链接,生成相应的.o文件。

  • -S

生成汇编代码到相应的.s文件。

  • -E

只进行预处理,完成头文件的包含、条件编译及宏替换等,并输出到标准输出设备上。

  • -w

隐藏警告信息。

  • -Wall

给出大部分警告信息,比如最常见的”unused variable”。

  • -Werror

将所有警告信息作为错误并中止编译。

  • -pedantic

执行严格的ISO C/C++检查,对所有不符合ISO C/C++规范的语法给以警告。

  • -pedantic-errors

将所有-pedantic选项给出的警告信息作为错误并中止编译。

  • -g

生成调试信息。

* -pg

启用gprof功能,产生额外的代码,搜集程序执行过程中的profile信息,写到缺省文件gmon.out中。

  • -Ox

优化选项。 O0:不进行优化,O1:优化,O2:进一步优化,O3:更进一步优化,Os:针对代码体积进行优化

  • -D name
  • -D name=definition

在编译命令行进行宏定义。

  • -I dir

增加一个目录到头文件搜索列表中。 从搜索次序的角度来讲,这个选项指定的搜索目录在标准系统头文件搜索路径之前。

  • -nostdinc

不搜索标准系统头文件路径。

  • -isystem dir

增加一个目录到头文件搜索列表中。 从搜索次序的角度来讲,这个选项指定的目录在标准系统头文件搜索路径之前,但在-I指定的搜索路径之后。

  • -llib

要求链接器链接名为liblib.a的静态库或名为liblib.so的动态库。

  • -Ldir

增加一个目录到静态链接库的搜索路径中。

  • -static

实行静态链接,避免使用动态库。

  • -shared

生成动态库文件(这个选项需要与-fpic选项共同使用)。

  • -fpic

生成位置无关代码,此类代码可以被装载到内存的任何位置运行。

  • -nostdlib

不链接标准库,因此也就无法使用标准库提供的入口例程,也不需要main函数。 在使用这个选项的时候,需要显式指定可执行程序的入口地址,否则系统将.text节的起始地址作为入口地址。 这个选项通常用于编译bootloader和kernel等不在OS环境下运行的代码。

  • -e symbol

显式指定symbol为可执行程序入口。

  • -Tscriptfile

显示指定scriptfile作为链接器的脚本。

  • -Wl, option

传递选项给链接器ld。

  • -x language(c, c++, …)

强制指定源文件的编程语言(忽略扩展名)。 利用这个选项可以强制c语言源文件在编译过程中按照c++的规则生成符号,更便于c++代码调用。

4. 预定义宏

__FILE__    一个字符串常量形式的当前输入文件名。
__LINE__    一个十进制整数形式的当前代码行数。
__DATA__    一个字符串常量形式的当前日期。
__TIME__    一个字符串常量形式的当前时间。
__cplusplus    一个标识C++的宏
__GCC__    GCC内定义宏。
__VERSION__    一个字符串常量形式的当前编译器版本号。

除了最最常用的几个选项如-c -o -Wall -O -g -l -L -I等,好多GCC的选项并不很容易记得住,于是常常要查Manual,然而Manual又那么庞大,便整理了这份备忘录并希望不断地增加内容。

埋头看Manual是不现实的——即使是中文版,如果没有亲自使用和体会,许多选项并不是很容易理解,比如-fpic,-nostdlib等。

tech/gnu/gcc.txt · Last modified: 2014/11/10 08:22 (external edit)