GCC中文使用手册
ld中文使用手册完全版(译).
使用ld ******** 本文档介绍GNU连接器ld的2.14版本. 本文档在GNU自由文档许可证下发行.在"GNU自由文档许可证"一章中有关于本许可证的一份拷贝. 概述 ******** 'ld'把一定量的目标文件跟档案文件连接起来,并重定位它们的数据,连接符号引用.一般,在编译一个程序时,最后一步就是运行'ld'. 'ld'能接受连接命令语言文件,这是一种用AT&T的连接编辑命令语言的超集写成的文件,用来在连接的整个过程中提供显式的,全局的控制. 本版本的'ld'使用通用BFD库来操作目标文件.这就允许'ld'读取,合并,写入目标文件时,可以使用各种不同的格式,比如,COFF或'a.out'. 不同的格式可以被连接到一起产生一个有效的目标文件. 除了它的灵活性,GNU连接器比其它连接器更有用的地方在于它提供了诊断信息. 许多连接器在碰到一个错误的时候立即放弃执行;但'ld'却能够继续执行,以让你发现其他的错误(或者,在某些情况下,得到一个带有错误的输出文件) 引用 ********** GNU连接器'ld'能够处理大量的不同情况,并且跟其他的连接器保持尽可能的兼容.这样,你就拥有更多的选择来控制它的行为. 命令行选项 ==================== 连接器提供大量的命令行选项,但是,在实际使用中,只有少数被经常使用.比如,'ld'的一个经常的使用场合是在一个标准的Unix系统上连接标准的Unix目标文件.在这样的一个系统上,连接文件'hello.o'如下: ld -o OUTPUT /lib/crt0.o hello.o -lc 这告诉'ld'产生一个叫OUTPUT的文件,作为连接文件'/lib/crt0.o'和'hello.o'和库'libc.a'的结果.'libc.a' 来自标准的搜索路径.(参阅下文的关于'-l'选项的讨论). 有些命令行选项可以在命令行的任何位置出现.但是,那些带有文件名的选项,比如'-l'或者'-T',会让文件在选项出现的位置上被读取. 对于非文件选项,以带不同的参数重复它,不会有进一步的效果,或者覆盖掉前面的相同项.那些多次出现时具有特殊含义的选项会在下文的描述中指出. 无参数选项是那些被连接的目标文件和档案文件.它们可能紧随命令行选项,或在它们前面,或者跟它们夹杂在一起,但是一个目标文件参数是不会出现在一个选项跟它的参数之间的. 通常,连接器至少引用一个目标文件,但是你可指定其它形式的二进制输入文件,这可以通过'-l','-R'或者脚本命令语言来实现.如果没有任何二进制文件被指定,连接器不会产生任何输出,并给出信息:"缺少输入文件." 如果连接器不能识别目标文件的格式,它会假设这些只是连接脚本.以这种方式指定的脚本增加了连接用的主连接脚本的内容(主连接脚本即缺省连接脚本或使用'-T'指定的脚本). 这个特性可以允许连接器连接一些文件, 它们看上去既像目标文件,又像档案文件,但实际上只是定义了一些符号值,或者使用'INPUT'或'GROUP'来载入其它的目标文件.需要注意的是,用这种方式指定一个脚本只是增加了主连接脚本的内容;要完全替换掉主连接脚本 ,需要使用'-T'. 对于名称是单个字符的选项,选项参数必须紧跟在选项字母后面,中间不留空,或者也可留有一个空格. 对于名称是多个字符的选项,选项前可以有一个或两个破折号;比如,'-trace-symbol'和`--trace-symbol'是等价的. 注意,对于这条规则有一个例外.那些以小写字母'o'开头的多字符选项前面只能是两个破折号,这是为了避免跟选项'-o'混淆. 比如'-omagic'把输出文件的名字定为'magic',而'--omagic'在输出文件中设置NMAGIC标志. 多字符选项的参数必须跟选项名间以一个等于号分开,或者以一个空格分开.比如:`--trace-symbol foo'和 `--trace-symbol=foo'是等价的. 多字符选项的名字唯一缩写符也是可以被接受的. 注意,如果连接器通过被编译器驱动来间接引用(比如gcc), 那所有的连接器命令行选项前必须加上前缀'-Wl' (或者能被特定编译器驱动接受的其他前缀),就像下面这样: gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup 这很重要,因为否则的话,编译器驱动程序会默认丢掉这些连接选项,产生一个错误的连接. 下面是关于被GNU连接器接受的常用命令行开关的一个列表: `-aKEYWORD' 这个选项在HP/UX兼容系统上被支持. 参数KEYWORD必须是下面字符串中的一个:`archive', `shared', or `default'. `-aarchive'在功能上跟`-Bstatic'相同,而另外两个关键字功能上跟 `-Bdynamic'相同. 这个选项可被多次使用. `-AARCHITECTURE' `--architecture=ARCHITECTURE' 在最近发行版本的'ld'中,这个选项只在Intel 960系列架构上有用. 在那种'ld'配置中,参数 ARCHITECTURE确定960系列的某一特定架构,启用某些安全措施,并修改档案库的搜索路径. 将来的'ld'发行版可能为其它架构系列支持相似的功能. `-b INPUT-formAT' `--format=INPUT-formAT' 'ld'可以被配置为支持多于一种的目标文件.如果你的'ld'以这种方式被配置,你可以使用'-b'选项为输入目标文件指定二进制格式. 就算'ld'被配置为支持可选目标格式,你不必经常指定这一项, 因为'ld'被配置为在每一台机子上把最常用的格式作为默认输入格式. INPUT-formAT是一个字符串, 你可能在连接一个不常用的二进制格式文件时需要这个参数.你也可使用'-b'来显式切换格式(在连接不同格式的目标文件时),方法是在每一组特定格式的目标前使用'-b INPUT-formAT'. 缺省的格式是从环境变量'GNUTARGET'中得到的.你也可以从一个脚本中定义输入格式,使用的命令是 'TARGET'. `-cMRI-COMMANDFILE' `--mri-script=MRI-COMMANDFILE' 为了跟MRI生产的连接器兼容,'ld'接受另一种用受限命令语言写成的脚本文件,通过选项'-c'引入MRI 脚本文件;使用'-T'选项是运行用普通'ld'脚本语言写的连接脚本.如果MRI-CMDFILE 不存在,'ld'在'-L' 指定的目录中寻找. `-d' `-dc' `-dp' 这三个选项是等价的; 多字符形式是为了跟其他连接器兼容才被支持的.它们给普通符号分配空间,即使一个重定位输出文件已经被指定(通过'-r'). 脚本命令`FORCE_COMMON_ALLOCATION'具有同样的效果. `-e ENTRY' `--entry=ENTRY' 使用符号ENTRY作为你的程序的开始执行点,而不是使用缺省的进入点.如果没有叫做ENTRY的符号,连接器会企图把ENTRY作为一个数字进行分析,并使用它作为入口地址(数字会被解释为10进制的;你可以使用前导的'0x'强制为16进制,或'0'作为8进制.) `-E' `--export-dynamic' 当创建一个动态连接的可执行程序时, 把所有的符号加到动态符号表中.动态符号表是一个符号集,这些符号对于运行时的动态对象是可见的. 如果你不使用这个选项,动态符号表中就会只含有那些连接进来的动态对象中用到的符号如果你使用'dlopen'来载入动态对象,它需要引用程序中的符号,那你可能需要在连接程序时用到这个选项. 你也可以使用版本脚本来控制哪些符号应当被加到动态符号表中. `-EB' 连接big-endian对象. 这会影响缺省输出格式. `-EL' 连接little-endian 对象. 这会影响缺省输出格式. `-g' 忽略. 为了跟其它工具兼容而提供. `-i' 执行一个增量连接(跟'-r'等同) `-init NAME' 当创建一个ELF可执行文件或共享对象时,当可执行文件或共享对象被加载时,调用NAME, 这是通过把 DT_INIT设置成函数的地址实现的. 缺省情况下,连接器使用'_init'作为调用的函数. `-lARCHIVE' `--library=ARCHIVE' 增加一个档案文件ARCHIVE到连接的文件列表中.这个选项可以被多次使用. 'ld'会为每一个指定的 ARCHIVE搜索它的路径列表,寻找`libARCHIVE.a' 对于支持共享库的系统, 'ld'可能还会搜索扩展名不是'.a'库.特别的,在ELF和SunOS系统上,'ld'会在搜索带有'.a'扩展名的库前搜索带'.so'扩展名的库. `-M' `--print-map' 打印一个连接位图到标准输出.一个连接位图提供的关于连接的信息有如下一些: * 目标文件和符号被映射到内存的哪些地方. * 普通符号如何被分配空间. * 所有被连接进来的档案文件,还有导致档案文件被包含进来的那个符号. `-n' `--nmagic' 关闭所有节的页对齐,如果可能,把输出格式标识为'NMAGIC'. `-N' `--omagic' 把text和data节设置为可读写.同时,取消数据节的页对齐,同时,取消对共享库的连接.如果输出格式支持Unix风格的magic number,把输出标志为'OMAGIC'. `--no-omagic' 这个选项执行的操作大部分正好跟'-N'相反.它设置text节只读,强制data节页对齐. 但是,这个选项并不开启连接共享库的功能. 使用'-Bdynamic'开启这个功能. `-o OUTPUT' `--output=OUTPUT' 使用OUTPUT作为'ld'产生的程序的名字;如果这个选项没有指定,缺省的输出文件名是'a.out'.脚本命令'OUTPUT'也可以被用来指定输出文件的文件名. `-O LEVEL' 如果LEVEL是一个比0大的数值, 'ld'优化输出.这可能会明显多占用时间,所以只有在生成最后的文件时使用. `-q' `--emit-relocs' 把重定位节和内容留在完全连接后的可执行文件中.连接分析和优化工具可能需要这些信息用来进行正确的修改与执行. 这在大的可执行文件中有用. 这个选项目前只支持ELF平台. `-r' `--relocateable' 产生可重定位的输出, 比如,产生一个输出文件它可再次作为'ld'的输入.这经常被叫做"部分连接". 作为一个副作用,在支持标准Unix魔数的环境中,这个选项会把输出文件的魔数设置为'OMAGIC'. 如果这个选项没有被指定,一个绝对文件就会被产生.当连接C++程序时,这个选项就不会解析构造函数的引用;要解析,必须使用'-Ur' 如果输入文件跟输出文件的格式不同,只有在输入文件不含有重定位信息的时候部分连接才被支持.输出格式不同的时候会有更多的限制.比如,有些'a.out'的格式在输入文件是其他格式的时候完全不支持部分连接. 这个选项跟'-i'等效. `-R FILENAME' `--just-symbols=FILENAME' 从FILENAME中读取符号名跟它们的值,但不重位这个文件,或者根本不把它包含在输出文件中.这就允许你的输出文件引用其它程序中定义的绝对内存地址.你可以多次使用这个选项. 为了跟其他ELF连接器兼容,如果'-R'选项后面跟有一个目录名,而不是一个文件名,它会被处理成 '-rpath'选项. `-s' `--strip-all' 忽略输出文件中所有的符号信息. `-S' `--strip-debug' 忽略输出文件中所有的调试符号信息(但不是所有符号). `-t' `--trace' 打印'ld'处理的所有输入文件的名字. `-T SCRIPTFILE' `--script=SCRIPTFILE' 把SCRIPTFILE作为连接脚本使用. 这个脚本会替代'ld'的缺省连接脚本(而不是增加它的内容),所以命令文件必须指定所有需要的东西以精确描述输出文件. 如果SCRIPTFILE在当前目录下不存在,'ld' 会在'-L'选项指定的所有目录下去寻找.多个'-T'选项会使内容累积. `-u SYMBOL' `--undefined=SYMBOL' 强制SYMBOL在输出文件中作为一个无定义的符号被输入.这样做会有一些效果,比如,会引发从标准库中连接更多的模块. '-u'可以以不同的参数反复使用,以输入多个无定义的符号.这个选项跟连接脚本命令中的'EXTERN'是等效的. `-Ur' 对于不是C++的程序,这个选项跟'-r'是等效的: 它产生可重定位的输出,比如,一个输出文件它可以再次作为'ld'的输入. 当连接C++程序时,'-Ur'解析构造函数的引用,跟'-r'不同. 但如果在一些用'-Ur' 连接过的文件上再次使用'-Ur',它不会工作,因为一旦构造函数表被建立,它不能被添加内容.请只在最后一遍连接的时候使用'-Ur', 对其它的,只使用'-r'. `--unique[=SECTION]' 对于所有匹配SECTION的输入节,在输出文件中都各自创建单独的节,或者,如果可选的通配符SECTION 参数丢失了,为每一个孤儿输入节创建一个输出节. 一个孤儿节是一个连接脚本中没有指定的节.你可以在命令行上多次使用这个选项; 它阻止对同名输入节的合并,在连接脚本中重载输出节分配. `-v' `--version' `-V' 显示'ld'的版本. '-V'选项同时会列出支持的模拟器. `-x' `--discard-all' 删除所有的本地符号. `-X' `--discard-locals' 删除所有的临时本地符号.对于大多数目标平台,就是所有的名字以'L'开头的本地符号. `-y SYMBOL' `--trace-symbol=SYMBOL' 打印出所有SYMBOL出现的被连接文件的名字. 这个选项可以被多次使用. 在很多系统中,这在预先确定底线时很有必要. 当你拥有一个未定义的符号,但不知道这个引用出自哪里的时候,这个选项很有用. `-Y PATH' 为缺省的库搜索路径增加一条路径.这个选项是为了跟Solaris兼容. `-z KEYWORD' 能被识别的关键字包括'initfirst', 'interpose', 'loadfltr',`nodefaultlib',`nodelete', `nodlopen', `nodump', `now', `origin',`combreloc', `nocombreloc' and`nocopyreloc'. 为了跟 Solaris兼容,所有其它的关键字都被忽略. 'initfirst'标志一个对象,使它在运行时,在所有其他对象之前被初始化. 'interpose'标志一个对象,使它的符号表放在所有其他符号之前,作为主要的执行者. 'loadfltr'标志一个对象, 使它的过滤器在运行时立即被处理.'nodefaultlib'标志一个对象,使在搜索本对象所依赖的库时,忽略所有缺省库搜索路径. 'nodelete'标志一个对象,使它在运行时不会被从内存中删除.'nodlopen'标志一个对象,使这个对象不可以通过'dlopen'载入.'nodump'标志一个对象,使它不能被'dldump'转储. 'now'标志一个对象,使它成为非懒惰运行时绑定对象. 'origin'标志一些可能含有 $ORIGIN的对象,'defs'不允许无定义符号.'muldefs'允许重定义. 'comberloc'组合多个重定位节,重新排布它们,让动态符号可见. 'nocomberloc'使多个重定位节组合无效. 'nocopyreloc'使重定位拷贝后的结果无效. `-( ARCHIVES -)' `--start-group ARCHIVES --end-group' ARCHIVES应当是一个关于档案文件的列表. 它们可以是显式的文件名,或者'-l'选项. 这些指定的档案文件会被多遍搜索,直到没有新的无定义引用被创建. 通常,一个档案文件只会被搜索一次. 但如果这个档案文件中的一个符号需要被用来解析一个档案中的目标引用到的无定义的符号,而这个符号在命令行上的后面某个档案文件中出现, 连接器不能解析这个引用. 把这些档案文件分组后,它们都可被反复搜索直到所有可能的引用都被解析了为止. 使用这个选项有一个很大的运行开销. 只有在无法避免在多个档案文件中使用循环引用时才用它. `--accept-unknown-input-arch' `--no-accept-unknown-input-arch' 告诉连接器接受那些架构不能被识别的输入文件. 但前提假设是用户知道他们在做什么,并且是故意要连接这些未知的输入文件. 在版本2.14之前,这个是连接器的缺省行为. 从版本2.14以后的,缺省行为是拒绝这类输入文件, 所以`--accept-unknown-input-arch'选项被用来恢复旧的行为. `-assert KEYWORD' 这个选项被忽略,只是用来跟SunOS保持兼容. `-Bdynamic' `-dy' `-call_shared' 连接动态链接库. 这个仅仅在支持共享库的平台上有用.在这些平台上,这个选项通常是默认行为. 这个选项的不同形式是为了跟不同的系统保持兼容. 你可以在命令行上多次使用这个选项:它影响紧随其后的'-l' 选项的库搜索. `-Bgroup' 在动态节的'DT_FLAGS_1'入口上设置'DF_1_GROUP'标志.这会让运行时连接器在处理在这个对象和它的相关部分搜索时只在组中. '--no-undefined'是隐式的. 这个选项只在支持共享库的ELF平台上有用. `-Bstatic' `-dn' `-non_shared' `-static' 不连接共享库. 这个仅仅在支持共享库的平台上有用. 这个选项的不同形式是为了跟不同的系统保持兼容. 你可以在命令行上多次使用这个选项:它影响紧随其后的'-l'选项的库搜索. `-Bsymbolic' 当创建一个共享库时, 把对全局符号的引用绑定到共享库中的定义(如果有), 通常, 一个连接共享库的程序重载共享库中的定义是可能的. 这个选项只在支持共享库的ELF平台上有用. `--check-sections' `--no-check-sections' 让连接器在节地址被分配后不要去检查节地址是否重叠.通常,连接器会执行这种检查,如果它发现了任何重叠,它会产生相应的错误信息. 连接器知道也允许节的重叠. 缺省的行为可以使用命令行开关 `--check-sections'来恢复. `--cref' 输出一个交叉引用表. 如果一个连接器位图文件被产生, 交叉引用表被打印到位图文件. 否则, 它被打印到标准输出. 表的格式相当的简单, 所以,如果需要,可以通过一个脚本很轻易地处理它. 符号是以名字被打印输出,存储. 对于每一个符号,给出一个文件名列表. 如果符号被定义了, 列出的第一个文件是符号定义的所在. 接下来的文件包含符号的引用. `--no-define-common' 这个选项限制对普通符号的地址分配. 脚本命令`INHIBIT_COMMON_ALLOCATION'具有同等的效果. `--no-define-common'选项允许从输出文件的类型选择中确定对普通符号的地址分配; 否则, 一个非重定位输出类型强制为普通符号分配地址. 使用'--no-define-common'允许那些从共享库中引用的普通符号只在主程序中被分配地址. 这会消除在共享库中的无用的副本的空间, 同时,也防止了在有多个指定了搜索路径的动态模块在进行运行时符号解析时引起的混乱. `--defsym SYMBOL=EXPRESSION' 在输出文件中建立一个全局符号,这个符号拥有一个EXPRESSION指定的绝对地址. 你可以多次使用这个选项定义多个符号. EXPRESSION支持一个受限形式的算术运算:你可以给出一个十六进制常数或者一个已存在符号的名字,或者使用'+'和'-'来加或减十六进制常数或符号. 如果你需要更多的表达式,可以考虑在脚本中使用连接器命令语言, 注意在SYMBOL,=和EXPRESSION之间不允许有空格. `--demangle[=style]' `--no-demangle' 这些选项控制是否在错误信息和其它的输出中重组符号名. 当连接器被告知要重组, 它会试图把符号名以一种可读的形式的展现: 如果符号被以目标文件格式使用,它剥去前导的下划线,并且把C++形式的符号名转换成用户可读的名字. 不同的编译器有不同的重组形式. 可选的重组形式参数可以被用来为你的编译器选择一个相应的重组形式. 连接器会以缺省形式重组直至环境变量`COLLECT_NO_DEMANGLE'被设置. 这些选项可以被用来重载缺省的设置. `--dynamic-linker FILE' 设置动态连接器的名字. 这个只在产生动态连接的ELF可执行文件时有效. 缺省的动态连接器通常是正确的; 除非你知道你在干什么,不要使用这个选项. `--embedded-relocs' 这个选项只在连接MIPS嵌入式PIC代码时有效, 这些代码必须是由GNU的编译器跟汇编器通过-membedded-pic 选项生成的. 它导致连接器产生一个表,这个表被用来在运行时重定位所有的被静态初始化为指针值的数据. `--fatal-warnings' 把所有的警告视为错误. `--force-exe-suffix' 确保输出文件有一个.exe后缀. 如果一个被成功完整连接的输出文件不带有一个'.exe'或'.dll'后缀, 这个选项确保连接器把输出文件拷贝成带有'.exe'后缀的同名文件. 这个选项在使用微软系统来编译未经修改的Unix的makefile时很有用, 因为有些版本的windows不会运行一个不带有'.exe'后缀的映像. `--no-gc-sections' `--gc-sections' 允许对未使用的输入节的碎片收集. 在不支持这个选项的平台上,被忽略. 这个选项不能跟 '-r'选项共存也不能被用来进行动态连接. 缺省行为可以用`--no-gc-sections'进行恢复. `--help'在标准输出上打印一个命令行选项概要,然后退出. `--target-help' 打印一个所有目标平台相关的选项的概要,然后退出. `-Map MAPFILE' 打印一个连接位图到文件MAPFILE中. 参阅上面关于'-M'选项的描述. `--no-keep-memory' 'ld'通常会以速度优先于内存使用的方式优化程序,这是通过把输入文件的符号表放在内存缓冲中实现的, 这个选项告诉'ld'以内存使用优先来优化, 尽可能的减小符号表的重读. 这在'ld'在连接一个大文件时超出内存限制时有用. `--no-undefined' `-z defs' 通常,当创建一个非符号共享库时, 无定义的符号允许出现,并留待运行时连接器去解决. 这个选项关闭这样的无定义符号的使用. 开关`--no-allow-shlib-undefined'控制共享对象被连接进共享库时的行为. `--allow-multiple-definition' `-z muldefs' 通常,当一个符号被定义多次时, 连接器会报告一个致命错误. 这些选项允许重定义并且第一个定义被使用 `--allow-shlib-undefined' `--no-allow-shlib-undefined' 允许(缺省)或不允许无定义符号存在于共享对象中. 这个开关的设置会重载'--no-undefined',这里只关注共享对象. 这样,如果'--no-undefined'被设置,但'--no-allow-shlib-undefined'未被设置, 连锁反应是存在于规则对象文件中的无定义的符号会引起一个错误,但是在共享对象中的未定义的符号会被忽略. 把`--allow-shlib-undefined'设置为缺省的原因是在连接时指定的共享对象并不一定是载入时可载入的那个,所以,符号可能要到载入时间才被解析. `--no-undefined-version' 通常当一个符号有一个未定义的版本时,连接器会忽略它. 这个选项不允许符号有未定义的版本,并且碰到这种情况,会报告一个严重错误. `--no-warn-mismatch' 通常, 如果你因为一些原因,企图把一些不匹配的输入文件连接起来的时候,'ld'会给出一个错误,可能这些文件是因为由不同的处理器编译. 这个选项告诉'ld'应当对这样的错误默认允许. 这个选项必须小心使用. `--no-whole-archive' 为后面的档案文件关闭'--whole-archive'选项的影响. `--noinhibit-exec' 当一个可执行文件还可以使用时,就保留它. 通常,连接器如果在连接过程中遇到了错误,就不会产生输出文件;当它遇上错误时,它会退出而不写输出文件. `-nostdlib' 仅搜索那些在命令行上显式指定的库路径. 在连接脚本中(包含在命令行上指定的连接脚本)指定的库路径都被忽略. `--oformat OUTPUT-formAT' 'ld'可以被配置为支持多于一种的目标文件. 如果你的'ld'以这种方式被配置,你可以使用'--oformat' 选项来指定输出目标文件的二进制格式.就算'ld'被配置为支持多种目标格式,你也不必指定这个项,因为'ld'应当被配置为把最常用的输出格式作为默认格式. OUTPUT-formAT是一个文本串,是被BFD库支持的一个特定格式的名字.脚本命令'OUTPUT_formAT'也可以指定输出格式,但这个选项可以覆盖它. `-qmagic' 这个选项被忽略,只是为了跟Linux保持兼容. `-Qy' 这个选项被忽略,只是为了跟SVR4保持兼容. `--relax' 一个机器相关的选项. 只有在少数平台上,这个选项被支持. 在某些平台上,'--relax'选项在连接器解析程序中的地址时执行可能的全局优化, 比如松散地址模式和在输出文件中合成新的指令. 在某些平台上,连接时全局优化会进行符号调试导致程序不能运行. 在不支持这个选项的平台上,'--relax'被接受,但被忽略. `--retain-symbols-file FILENAME' 只保留在FILENAME中列出的那些符号,丢弃所有其他的. FILENAME是一个简单地平坦模式文件, 一个符号占一行. 这个选项在那些会逐步积累起一个大的全局符号表的系统中(比如 VxWorks)会很有用,它能有效地节约内存空间. '--retain-symbols-file'不丢弃未定义的符号,和需要重定位的符号. 你可能在命令行上只指定'--retain-symbol-file'一次, 它覆盖'-s'和'-S'的功能. `-rpath DIR' 为运行时库的搜索路径增加一个目录. 这个在连接带有共享库的ELF可执行文件时有用. '-rpath'的所有参数会被连接起来传递给运行时连接器, 运行时连接器在运行时用它们定位共享对象. '-rpath'选项在定位那些在连接参数指定的共享对象需要的共享对象时也很有用; 参阅关于'-rpath-link'选项的描述, 如果在连接一个ELF可执行文件时不使用'-rpath'选项,那些环境变量'LD_RUN_PATH'选项就会被使用. '-rptah'选项也可以使用在SunOS上.缺省地,在SunOS上,连接器会从所有的'-L'选项中形成一个运行时搜索路径. 如果使用了'-rpath'选项, 那运行时搜索路径就只从'-rpath'选项中得到, 忽略'-L'选项. 这在使用GCC时非常有用, 它会用上很多的'-L'选项,而这些路径很可能就是NFS挂上去的文件系统中. 为了同ELF的连接器兼容, 如果'-R'选面后面跟有一个目录名, 而不是一个文件名,那它也会被处理成'-rpath'选项. `-rpath-link DIR' 当在SunOS上使用ELF时,一个共享库可能会用到另一个共享库. 当'ld -share'把一个共享库作为一个输入文件连接时就有可能发生这种情况. 当一个连接器在作非共享,不可重定位连接时,如果遇上这种依赖情况,它会自动定位需要的共享库,然后把它包含在连接中, 如果在这种情况中,它没有被显式包含, 那'-rpath-link'选项指定优先搜索的一组路径名. 这个选项必须小心使用,因为它会覆盖那些可能已经被编译进共享库中的搜索路径. 在这种情况下,它就有可能使用一个非内部的不同的搜索路径. 连接器使用下面的搜索路径来定位需要的共享库: 1. 所有由'-rpath-link'选项指定的搜索路径.2. 所有由'-rpath'指定的搜索路径. '-rpath'跟'-rpath_link'的不同之处在于,由'-rpath'指定的路径被包含在可执行文件中,并在运行时使用, 而'-rpath-link'选项仅仅在连接时起作用. 它只用于本地连接器. 3. 在一个ELF系统中, 如果'-rpath'和'rpath-link'选项没有被使用, 会搜索环境变量'LD_RUN_PATH'的内容.它也只对本地连接器起作用. 4. 在SunOS上, '-rpath'选项不使用, 只搜索所有由'-L'指定的目录. 5. 对于一个本地连接器,环境变量'LD_LIBRARY_PATH'的内容被搜索. 6. 对于一个本地ELF连接器,共享库中的`DT_RUNPATH'和`DT_RPATH'操作符会被需要它的共享库搜索. 如果'DT_RUNPATH' 存在了, 那'DT_RPATH'就会被忽略. 7. 缺省目录, 常规的,如'/lib'和'/usr/lib'. 8. 对于ELF系统上的本地连接器, 如果文件'/etc/ld.so.conf'存在,这个文件中有的目录会被搜索. 如果需要的共享库没有被找到, 那连接器会发出一条警告信息,并继续执行连接. `-shared' `-Bshareable' 创建一个共享库. 这个选项只在ELF, XCOFF和SunOS平台上有用。
GCC使用说明
GCC使用手册及常用命令行GCC使用手册作者:Clock1.前言GCC编译器的手册(GCC MANUAL)的英文版已经非常全面,并且结构也非常完善了,只是一直都没有中文的版本,我这次阅读了GCC编译器的主要内容,对手册的内容进行了结构性的了解,认为有必要对这次阅读的内容进行整理,为以后的工作做准备。
由于我对这个英文手册的阅读也仅仅是结构性的。
因此有很多地方并没有看,所以这篇文档的内容我也只能写出部分,对于以后需要详细了解的地方,会再往这篇文档中增添内容,需要增添的内容主要是编译器的各种开关。
2. 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步:a.预处理,把预处理命令扫描处理完毕;b.编译,把预处理后的结果编译成汇编或者目标模块;c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;d.连接,把多个目标代码模块连接生成一个大的目标模块;3. GCC开关GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。
3.1. 全局开关(OVERALL OPTIONS)全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。
GCC常见参数配置
GCC常见参数配置简介gcc 和 g++现在是gnu中最主要和最流⾏的c & c++编译器 .gcc/g++在执⾏编译⼯作的时候,总共需要以下⼏步:1.预处理,⽣成.i的⽂件[预处理器cpp]2.将预处理后的⽂件不转换成汇编语⾔,⽣成⽂件.s[编译器egcs]3.有汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]4.连接⽬标代码,⽣成可执⾏程序[链接器ld]GCC能够处理的后缀有:a. *.c *.C (C语⾔)b. *.cxx *.cc (C++语⾔)c. *.m (⾯向对象的C)d. *.i (预处理后的C语⾔源⽂件)e. *.ii (预处理后的C++语⾔源⽂件)f. *.s *.S (汇编语⾔)h. *.h (头⽂件)⽬标⽂件可以是:1. *.o 编译连接后的⽬标⽂件2. *.a 库⽂件gcc与g++有什么区别共同点: gcc和g++都是GNU(组织)的⼀个编译器。
误区⼀:gcc只能编译c代码,g++只能编译c++代码1.后缀为.c的,gcc把它当作是C程序,⽽g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。
C++的语法规则更加严谨⼀些。
2.编译阶段,g++会调⽤gcc,对于c++代码,两者是等价的,但是因为gcc命令不能⾃动和C++程序使⽤的库联接,所以通常⽤g++来完成链接,为了统⼀起见,⼲脆编译/链接统统⽤g++了,这就给⼈⼀种错觉,好像cpp程序只能⽤g++似的。
误区⼆:gcc不会定义__cplusplus宏,⽽g++会实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采⽤gcc编译器,则该宏就是未定义的,否则,就是已定义。
误区三:编译只能⽤gcc,链接只能⽤g++严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以⽤gcc/g++,⽽链接可以⽤g++或者gcc -lstdc++。
目前最全的GCC+中文手册(最新整理)
GCC 中文手册作者:徐明-msvr4-msvr3打开(`-msvr4')或关闭(`-msvr3')和System V第四版(SVr4)相关的编译器扩展.效果如下:*输出哪种汇编语法(你可以使用`-mversion-03.00'选项单独选择).*`-msvr4'使C预处理器识别`#pragma weak'指令*`-msvr4'使GCC输出额外的声明指令(declaration directive),用于SVr4.除了SVr4配置, `-msvr3'是所有m88K配置的默认选项.-mtrap-large-shift-mhandle-large-shift包含一些指令,用于检测大于31位的位移(bit-shift);根据相应的选项,对这样的位移发出自陷 (trap)或执行适当的处理代码.默认情况下, GCC对大位移不做特别处理.-muse-div-instruction很早以前的88K型号没有(div)除法指令,因此默认情况下GCC避免产生这条指令.而这个选项告诉GCC该指令是安全的.-mversion-03.00在DG/UX配置中存在两种风格的SVr4.这个选项修改-msvr4 ,选择hybrid-COFF或 real-ELF风格.其他配置均忽略该选项.-mwarn-passed-structs如果某个函数把结构当做参数或结果传递, GCC发出警告.随着C语言的发展,人们已经改变了传递结构的约定, 它往往导致移植问题.默认情况下, GCC不会发出警告.下面的选项用于IBM RS6000:-mfp-in-toc-mno-fp-in-toc控制是否把浮点常量放到内容表(TOC)中,内容表存放所有的全局变量和函数地址.默认情况下, GCC把浮点常量放到这里;如果TOC溢出, `-mno-fp-in-toc'选项能够减少TOC的大小,这样就可以避免溢出.下面的`-m'选项用于IBM RT PC:-min-line-mul对于整数乘法使用嵌入代码.这是默认选项.-mcall-lib-mul对于整数乘法使用lmul$$ .-mfull-fp-blocks生成全尺寸浮点数据块,包括IBM建议的最少数量的活动空间(scratch space).这是默认选项.-mminimum-fp-blocks不要在浮点数据块中包括额外的活动空间.这样就产生较小但是略慢的可执行程序,因为活动空间必须动态分配.-mfp-arg-in-fpregs采用不兼容IBM调用约定的调用序列,通过浮点寄存器传送浮点参数.注意,如果指定了这个选项, varargs.h和stdargs.h将无法支持浮点单元.-mfp-arg-in-gregs使用正常的调用约定处理浮点参数.这是默认选项.-mhc-struct-return通过内存返回大于一个字的结构,而不是通过寄存器.用于兼容MetaWare HighC (hc)编译器.使用 `-fpcc-struct-return'选项可以兼容Portable C编译器(pcc).-mnohc-struct-return如果可以,通过寄存器返回某些大于一个字的结构.这是默认选项.如果打算兼容IBM提供的编译器,请使用 `-fpcc-struct-return'或`-mhc-struct-return'选项.下面的`-m'选项用于MIPS家族的计算机:-mcpu=cpu-type生成指令的时候,假设默认的机器类型是cpu-type .默认情况下的cpu-type是 default, GCC将选取任何机型上都是最长周期时间的指令,这样才能使代码在所有的MIPS处理器上以合理的速度运行. cpu-type的其他选择是r2000, r3000, r4000,和 r6000.虽然选定某个cpu-type后, GCC将针对选定的芯片安排对应的工作,但是如果不指定?? -mips2或-mips3选项,编译器不会输出任何不符合MIPS ISA (instruction set architecture)一级的代码.-mips2输出MIPS ISA二级指令(可能的扩展,如平方根指令). -mcpu=r4000或-mcpu=r6000 选项必须和-mips2联用.-mips3输出MIPS ISA三级指令(64位指令). -mcpu=r4000选项必须和-mips2联用. (译注:疑为-mips3)-mint64-mlong64-mlonglong128这些选项目前不起作用.-mmips-as产生用于MIPS汇编器的代码,同时使用mips-tfile添加普通的调试信息.对于大多数平台这是默认选项,除了OSF/1参考平台,它使用OSF/rose目标格式.如果打开了任一个-ggdb, -gstabs,或-gstabs+选项开关, mips-tfile程序就把stab封装在MIPS ECOFF里面.-mgas产生用于GNU汇编器的代码.在OSF/1参考平台上这是默认选项,它使用OSF/rose目标格式.-mrnames-mno-rnames-mrnames开关选项告诉输出代码使用MIPS软件名称说明寄存器,而不是硬件名称(就是说,用 a0代替$4). GNU汇编器不支持-mrnames选项,而MIPS汇编器则运行MIPS C预处理器处理源文件. -mno-rnames是默认选项.-mno-gpopt-mgpopt开关选项要求在正文段中把所有的数据声明写到指令前面,使各种MIPS汇编器对短类型全局或静态数据项(short global or static data items)输出单字内存访问而不是双字内存访问.当打开编译优化时,这是默认功能.-mstats-mno-stats每次处理完非嵌入函数(non-inline function)后, -mstats开关选项使编译器向标准错误文件输出一行关于程序的统计资料(保存的寄存器数目,堆栈大小,等等).-mmemcpy-mno-memcpy-mmemcpy开关选项使所有的块移动操作调用适当的string函数(memcpy或 bcopy),而不是生成嵌入代码.-mmips-tfile-mno-mips-tfile当MIPS汇编器生成mips-tfile文件(用于帮助调试)后, -mno-mips-tfile 开关选项阻止编译器使用mips-tfile后期处理(postprocess)目标文件.不运行 mips-tfile就没有调试器关注的局部变量.另外, stage2和stage3目标文件将把临时文件名传递给汇编器,嵌在目标文件中,这意味着不比较目标文件是否相同.-msoft-float输出包含浮点库调用. 警告: 所需库不是GNU CC的一部分.一般说来使用该机型本地C编译器的相应部件, 但是不能直接用于交叉编译,你必须自己安排,提供交叉编译适用的库函数.-mhard-float输出包含浮点指令.如果编译器没有被改动,这就是默认选项.-mfp64编译器认为状态字的FR置位(on),也就是说存在32 64-bit浮点寄存器,而不是32 32-bit 浮点寄存器.同时必须打开-mcpu=r4000和-mips3开关.-mfp32认为存在32 32-bit浮点寄存器.这是默认选项.-mabicalls-mno-abicalls输出(或不输出) .abicalls, .cpload,和.cprestore伪指令,某些 System V.4版本用于位置无关代码.-mhalf-pic-mno-half-pic-mhalf-pic开关选项要求把外部引用的指针放到数据段,并且载入内存,而不放到正文段.该选项目前不起作用.-G num把小于等于num字节的全局或静态数据放到小的数据段或bss段,而不是普通的数据段或bss段. 这样汇编器可以输出基于全局指针(gp或$28),的单字内存访问指令而非普通的双字指令.默认情况下, 用MIPS汇编器时num是8,而GNU汇编器则为0.另外, -Gnum选项也被传递给汇编器和连接器.所有的模块必须在相同的-Gnum值下编译.汇编用户汇编文件(带有`.s'后缀)时,告诉MIPS汇编器不要运行预处理器.下面的`-m'选项用于Intel 80386族计算机: -m486-mno-486控制是否生成对486优化的代码.-msoft-float输出包含浮点库调用. 警告: 所需库不是GNU CC的一部分.一般说来使用该机型本地C编译器的相应部件, 但是不能直接用于交叉编译,你必须自己安排,提供交叉编译适用的库函数.在函数把浮点返回值放在80387寄存器栈的机器上,即使设置了`-msoft-float'选项,也可能会发出一些浮点操作码.-mno-fp-ret-in-387不用FPU寄存器返回函数值.通常函数调用约定把float和double的返回值放在FPU寄存器中,即使不存在FPU. 这种作法的理念是操作系统应该仿真出FPU.而`-mno-fp-ret-in-387'选项使浮点值通过普通的CPU寄存器返回.下面的`-m'选项用于HPPA族计算机:-mpa-risc-1-0生成PA 1.0处理器的目标码.-mpa-risc-1-1生成PA 1.1处理器的目标码.-mkernel生成适用于内核的目标码.特别要避免add指令,它有一个参数是DP寄存器;用addil 代替add指令.这样可以避免HP-UX 连接器的某个严重bug.-mshared-libs生成能够连接HP-UX共享库的目标码.该选项还没有实现全部功能,对PA目标默认为关闭.使用这个选项会导致编译器生成错误的目标码.-mno-shared-libs不生成连接HP-UX共享库的目标码.这是PA目标的默认选项.-mlong-calls生成的目标码允许同一个源文件中的函数调用,调用点和被调函数的距离可以超过256K之远.不需要打开这个开关选项,除非连接器给出``branch out of range errors``这样的错误.-mdisable-fpregs防止任何情况下使用浮点寄存器.编译内核需要这个选项,内核切换浮点寄存器的执行环境速度非常缓慢.如果打开了这个开关选项同时试图浮点操作,编译将失败.-mdisable-indexing防止编译器使用索引地址模式(indexing address mode).这样在MACH上编译MIG生成的代码时,可以避免一些非常晦涩的问题.-mtrailing-colon在标记定义(label definition)的末尾添加一个冒号(用于ELF汇编器).下面的`-m'选项用于Intel 80960族计算机:-mcpu-type默认机器类型为cpu-type ,使编译器产生对应的指令,地址模式和内存对齐.默认的 cpu-type是kb;其他选择有ka, mc, ca, cf, sa,和sb.-mnumerics-msoft-float-mnumerics开关选项指出处理器不支持浮点指令. -msoft-float开关选项指出不应该认为机器支持浮点操作.-mleaf-procedures-mno-leaf-procedures企图(或防止)改变叶过程(leaf procedure),使其可被bal指令以及call指令调用.对于直接函数调用,如果bal指令能够被汇编器或连接器替换,这可以产生更有效的代码,但是其他情况下产生较低效的代码,例如通过函数指针调用函数,或使用了不支持这种优化的连接器.-mtail-call-mno-tail-call执行(或不执行)更多的尝试(除过编译器那些机器无关部分),优化进入分支的尾递归(tail-recursive)调用.你可能不需要这个,因为检测什么地方无效没有全部完成.默认开关是-mno-tail-call.-mcomplex-addr-mno-complex-addr认为(或不认为)在当前的i960设备上,值得使用复合地址模式(complex addressing mode).复合地址模式可能不值得用到K系列,但是一定值得用在C系列.目前除了CB和CC处理器,其他处理器上 -mcomplex-addr是默认选项.-mcode-align-mno-code-align把目标码对齐到8字节边界上(或者不必),这样读取会快一些.目前只对C系列默认打开.-mic-compat-mic2.0-compat-mic3.0-compat兼容iC960 v2.0或v3.0.-masm-compat-mintel-asm兼容iC960汇编器.-mstrict-align-mno-strict-align不允许(或允许)边界不对齐的访问.-mold-align使结构对齐(structure-alignment)兼容Intel的gcc发行版本1.3 (基于gcc 1.37).目前这个选项有点问题,因为#pragma align 1总是作同样的设定,而且无法关掉.下面的`-m'选项用于DEC Alpha设备:-mno-soft-float-msoft-float使用(或不使用)硬件浮点指令进行浮点运算.打开-msoft-float时,将使用 `libgcc1.c'中的函数执行浮点运算.除非它们被仿真浮点操作的例程替换,或者类似,它们被编译为调用仿真例程,这些例程将发出浮点操作.如果你为不带浮点操作的Alpha编译程序,你必须确保建立了这个库,以便不调用仿真例程.注意,不带浮点操作的Alpha也要求拥有浮点寄存器.-mfp-reg-mno-fp-regs生成使用(或不使用)浮点寄存器群的目标代码. -mno-fp-regs包含有-msoft-float 开关选项.如果不使用浮点寄存器,浮点操作数就象整数一样通过整数寄存器传送,浮点运算结果放到$0而不是$f0.这是非标准调用,因此任何带有浮点参数或返回值的函数,如果被-mno-fp-regs开关编译过的目标码调用,它也必须用这个选项编译.这个选项的典型用法是建立内核,内核不使用任何浮点寄存器,因此没必要保存和恢复这些寄存器.下面附加的选项出现在System V第四版中,用于兼容这些系统中的其他编译器:-G在SVr4系统中, gcc出于兼容接受了`-G'选项(然后传递给连接器).可是我们建议使用 `-symbolic'或`-shared'选项,而不在gcc命令行上出现连接选项.-Qy验证编译器用的工具的版本,输出到.ident汇编指令.-Qn制止输出端的.ident指令(默认选项).-YP,dirs对于`-l'指定的库文件,只搜索dirs.你可以在dirs中用冒号隔开各个目录项.-Ym,dir在dir目录中寻找M4预处理器.汇编器使用这个选项.代码生成选项(CODE GENERATION OPTION)下面的选项和平台无关,用于控制目标码生成的接口约定.大部分选项以`-f'开始.这些选项拥有确定和否定两种格式; `-ffoo'的否定格式是 `-fno-foo'.后面的描述将只列举其中的一个格式---非默认的格式.你可以通过添加或去掉 `no-'推测出另一个格式.-fnonnull-objects假设通过引用(reference)取得的对象不为null (仅C++).一般说来, GNU C++对通过引用取得的对象作保守假设.例如,编译器一定会检查下似代码中的a不为 null:obj &a = g (); a.f (2);检查类似的引用需要额外的代码,然而对于很多程序是不必要的.如果你的程序不要求这种检查,你可以用 `-fnonnull-objects'选项忽略它.-fpcc-struct-return函数返回struct和union值时,采用和本地编译器相同的参数约定.对于较小的结构, 这种约定的效率偏低,而且很多机器上不能重入;它的优点是允许GCC编译的目标码和PCC编译的目标码互相调用.-freg-struct-return一有可能就通过寄存器返回struct和union函数值.对于较小的结构,它比 -fpcc-struct-return更有效率.如果既没有指定-fpcc-struct-return ,也没有指定-freg-struct-return, GNU CC默认使用目标机的标准约定.如果没有标准约定, GNU CC默认采用-fpcc-struct-return.-fshort-enums给enum类型只分配它声明的值域范围的字节数.就是说, enum类型等于大小足够的最小整数类型.-fshort-double使double类型的大小和float一样.-fshared-data要求编译结果的数据和非const变量是共享数据,而不是私有数据.这种差别仅在某些操作系统上面有意义, 那里的共享数据在同一个程序的若干进程间共享,而私有数据在每个进程内都有副件.-fno-common即使未初始化的全局变量也分配在目标文件的bss段,而不是把它们当做普通块(common block)建立.这样的结果是,如果在两个不同的编译结果中声明了同一个变量(没使用extern ),连接它们时会产生错误. 这个选项可能有用的唯一情况是,你希望确认程序能在其他系统上运行,而其他系统总是这么做.-fno-ident忽略`#ident'指令.-fno-gnu-linker不要把全局初始化部件(如C++的构造子和解构子)输出为GNU连接器使用的格式(在GNU连接器是标准方法的系统上).当你打算使用非GNU连接器的时候可以用这个选项,非GNU连接器也需要collect2程序确保系统连接器放入构造子(constructor)和解构子(destructor). (GNU CC的发布包中包含有collect2 程序.)对于必须使用collect2的系统,编译器驱动程序gcc自动配置为这么做.-finhibit-size-directive不要输出.size汇编指令,或其他类似指令,当某个函数一分为二,两部分在内存中距离很远时会引起问题. 当编译`crtstuff.c'时需要这个选项;其他情况下都不应该使用.-fverbose-asm输出汇编代码时放些额外的注释信息.这个选项仅用于确实需要阅读汇编输出的时候(可能调试编译器自己的时候).-fvolatile使编译器认为所有通过指针访问的内存是易变内存(volatile).-fvolatile-global使编译器认为所有的外部和全局变量是易变内存.-fpic如果支持这种目标机,编译器就生成位置无关目标码.适用于共享库(shared library).-fPIC如果支持这种目标机,编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围转移.-ffixed-reg把名为reg的寄存器按固定寄存器看待(fixed register);生成的目标码不应该引用它(除了或许用作栈指针,帧指针,或其他固定的角色).reg必须是寄存器的名字.寄存器名字取决于机器,用机器描述宏文件的REGISTER_NAMES宏定义.这个选项没有否定格式,因为它列出三路选择.-fcall-used-reg把名为reg的寄存器按可分配寄存器看待,不能在函数调用间使用.可以临时使用或当做变量使用,生存期不超过一个函数.这样编译的函数无需保存和恢复reg寄存器.如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.这个选项没有否定格式,因为它列出三路选择.-fcall-saved-reg把名为reg的寄存器按函数保护的可分配寄存器看待.可以临时使用或当做变量使用,它甚至能在函数间生存.这样编译的函数会保存和恢复使用中的reg寄存器.如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.另一种灾难是用这个选项说明的寄存器返回函数值.这个选项没有否定格式,因为它列出三路选择.PRAGMASGNU C++支持两条`#pragma'指令使同一个头文件有两个用途:对象类的接口定义, 对象类完整的内容定义.#pragma interface(仅对C++)在定义对象类的头文件中,使用这个指令可以节省大部分采用该类的目标文件的大小.一般说来,某些信息 (内嵌成员函数的备份副件,调试信息,实现虚函数的内部表格等)的本地副件必须保存在包含类定义的各个目标文件中.使用这个 pragma指令能够避免这样的复制.当编译中引用包含`#pragma interface'指令的头文件时,就不会产生这些辅助信息(除非输入的主文件使用了`#pragma implementation'指令).作为替代,目标文件将包含可被连接时解析的引用(reference).#pragma implementation#pragma implementation "objects.h"(仅对C++)如果要求从头文件产生完整的输出(并且全局可见),你应该在主输入文件中使用这条pragma.头文件中应该依次使用`#pragma interface'指令.在implementation文件中将产生全部内嵌成员函数的备份,调试信息,实现虚函数的内部表格等.如果`#pragma implementation'不带参数,它指的是和源文件有相同基本名的包含文件;例如, `'中, `#pragma implementation'等于`#pragma implementation allclass.h'.如果某个implementation文件需要从多个头文件引入代码,就应该使用这个字符串参数.不可能把一个头文件里面的内容分割到多个implementation文件中.文件(FILE)file.c C源文件file.h C头文件(预处理文件)file.i 预处理后的C源文件file.C C++源文件 C++源文件file.cxx C++源文件file.m Objective-C源文件file.s 汇编语言文件file.o 目标文件a.out 连接的输出文件TMPDIR/cc* 临时文件LIBDIR/cpp 预处理器LIBDIR/cc1 C编译器LIBDIR/cc1plus C++编译器LIBDIR/collect 某些机器需要的连接器前端(front end)程序LIBDIR/libgcc.a GCC子例程(subroutine)库/lib/crt[01n].o 启动例程(start-up)LIBDIR/ccrt0 C++的附加启动例程/lib/libc.a 标准C库,另见intro (3)/usr/include #include文件的标准目录LIBDIR/include #include文件的标准gcc目录LIBDIR/g++-include #include文件的附加g++目录LIBDIR通常为/usr/local/lib/machine/version.TMPDIR来自环境变量TMPDIR (如果存在,缺省为/usr/tmp ,否则为 /tmp).另见(SEE ALSO)cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).info中 `gcc', `cpp', `as', `ld',和`gdb'的条目.Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging wit h GDB: the GNU Source-Level Debugger, Richard M. Stallman和Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain 和Roland Pesch.BUGS关于报告差错的指导请查阅GCC手册.版权(COPYING)Copyright 1991, 1992, 1993 Free Software Foundation, Inc.Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provi ded that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for m odified versions, except that this permission notice may be included in translations approved by the Free Software Foundation i nstead of in the original English.作者(AUTHORS)关于GNU CC的奉献者请查阅GUN CC手册.[中文版维护人]徐明< xuming@ >[中文版最新更新]2003/05/13第一版《中国Linux论坛man手册页翻译计划》/[声明]这篇文档是我的关于gcc参数的笔记,我很怀念dos年代我用小本子,纪录所有的dos命令的参数.哈哈,下面的东西可能也不是很全面,我参考了很多的书,和gcc的帮助.不全的原因是,有可能我还没有看到这个参数,另一种原因是,我可能还不会用它:)不过,我会慢慢的补齐的.哈哈如果你要转在本文章请保留我的email(pianopan@ )和文章的全面性.[介绍]gcc and g++分别是gnu的c & c++编译器gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件2.将预处理后的文件不转换成汇编语言,生成文件.s3.有汇编变为目标代码(机器代码)生成.o的文件4.连接目标代码,生成可执行程序[参数详解]-x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根 据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果 你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这 个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数 的使用。
gcc编译的详细步骤
gcc编译的详细步骤⼀:GCC⼀般编译建⽴hello.c# vi hello.c#include <stdlib.h>#include <stdio.h>void main(void){printf("hello world!\r\n");}⽤gcc编译成执⾏程序。
#gcc -o hello hello.c该命令将hello.c直接⽣成最终⼆进制可执⾏程序a.out这条命令隐含执⾏了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的⼆进制可执⾏程序。
这⾥未指定输出⽂件,默认输出为a.out。
如何要指定最终⼆进制可执⾏程序名,那么⽤-o选项来指定名称。
⽐如需要⽣成执⾏程序hello.exe那么#gcc hello.c -o hello.exe⼆:GCC编译详细步骤,分为四步:从上⾯我们知道GCC编译源代码⽣成最终可执⾏的⼆进制程序,GCC后台隐含执⾏了四个阶段步骤。
GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接现在我们就⽤GCC的命令选项来逐个剖析GCC过程。
1)预处理(Pre-processing)在该阶段,编译器将C源代码中的包含的头⽂件如stdio.h编译进来,⽤户可以使⽤gcc的选项”-E”进⾏查看。
⽤法:#gcc -E hello.c -o hello.i作⽤:将hello.c预处理输出hello.i⽂件。
[root]# gcc -E hello.c -o hello.i[root]# lshello.c hello.i[root]# vi hello.i# 1 "hello.c"# 1 "<built-in>"# 1 "<command line>"# 1 "hello.c"# 1 "/usr/include/stdlib.h" 1 3# 25 "/usr/include/stdlib.h" 3# 1 "/usr/include/features.h" 1 3# 291 "/usr/include/features.h" 3# 1 "/usr/include/sys/cdefs.h" 1 3# 292 "/usr/include/features.h" 2 3# 314 "/usr/include/features.h" 3# 1 "/usr/include/gnu/stubs.h" 1 3# 315 "/usr/include/features.h" 2 3# 26 "/usr/include/stdlib.h" 2 3# 3 "hello.c" 2void main(void){printf("hello world!\r\n");}2)编译阶段(Compiling)第⼆步进⾏的是编译阶段,在这个阶段中,Gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,Gcc把代码翻译成汇编语⾔。
gcc, as, ld的一些笔记
gcc, as, ld的一些笔记(一)(原创)1.本文不是教程,只是描述c语言(gcc环境),编译器,连接器,加载器,at&t汇编,ia32一些相关知识和笔记,很多需要深入的地方需要大家寻找相关的资料学习。
如果发现错误,请留言或通知我jinglexy at yahoo dot com dot cn,这个是我的msn。
打字不易,请转载时保留作者。
2.gcc安装的各个部分:g++ c++编译器,链接时使用c++库gcc c编译器,链接时使用c库cc1 实际的c编译器cc1plus 实际的c++编译器collect2 使用collect2产生特定的全局初始化代码,后台处理是传递参数给ld完成实际的链接工作。
crt0.o 初始化和结束代码libgcc 平台相关的库gcc安装需要的文件:gcc-core-3.4.6.tar.gz2 gcc核心编译器,默认只包含c编译器gcc-g++-3.4.6.tar.bz2 g++编译器gcc-testsuite-3.4.6.tar.bz2 测试套件./configure && make && make install3.binutils安装的各个部分as gnu汇编工具gprof 性能分析工具ld gnu链接器makeobjcopy 目标文件从二进制格式翻译或复制到另一种objdump 显示目标文件的各种信息strings 显示文件的字符串strip 去除符合表readelf 分析elf并显示信息链接器可以读写各种目标文件中的信息,通过BFD(binary file descriptor)提供的工具实现,BFD定义了类似a.out, elf, coff 等目标文件的格式。
4.gcc预处理程序1)define指令#可将传递的宏字符串化##将两个名字连接成一个(注意不是连接成字符串)例:#define TEST(ARGTERM) \printf(“the term “ #ARGTERM “is a string\n”) 使用__VA_ARGS__定义可变参数宏例:#define err(...) fprintf(stderr, __VA_ARGS)err (“%s %d\n”, “error code is”, 48);为了消除无参数时的逗号,可以用下面方法定义:# define err(...) fprintf(stderr, ##__VA_ARGS)一种等同的方法是:#define dprintf(fmt, arg...) printf(fmt, ##arg) 其他例:#define PASTE(a, b) a##b2)error 和 warning指令#error “y here? bad boy!”3)if, elif, else, endif指令支持的运算符:加减乘除,位移,&&,||,!等示例:#if defined (CONFIG_A) || defined (CONFIG_B)……#endif4)gcc预定义宏__BASE_FILE__ 完整的源文件名路径__cplusplus 测试c++程序__DATE____FILE__ 源文件名__func__ 替代__FUNCTION__,__FUNCTION__以被GNU不推荐使用__TIME____LINE____VERSION__ gcc版本5)几个简单例子:例1:#define min(X, Y) \(__extension__ ({typeof (X) __x = (X), __y = (Y); \(__x < __y) ? __x : __y; }))#define max(X, Y) \(__extension__ ({typeof (X) __x = (X), __y = (Y); \(__x > __y) ? __x : __y; }))这样做的目的是消除宏对X,Y的改变的影响,例如:result = min(x++, --y); printf(x, y);补充:圆括号定义的符合语句可以生成返回值,例:result = ({ int a = 5;int b;b = a + 3;}); 将返回8例2:#define dprintfbin(buf, size) do{ int i; \printf("%s(%d)@", \__FUNCTION__, __LINE__); \for(i = 0; i < size - 1; i++){ \if(0 == i % 16) \printf("\n"); \printf("0x%02x ", ((char*)buf)[i]); \} \printf("0x%02x\n", ((char*)buf)[i]); \}while(0)这个比较简单,不用解释了例3:#ifdef __cplusplusextern "C"{#endifint foo1(void);int foo2(void);#ifdef __cplusplus}#endif作用:在c++程序中使用c函数及库,c++编译程序时将函数名粉碎成自己的方式,在没有extern的情况下可能是_Z3_foo1,_Z3_foo2将导致连接错误,这里的extern表示在连接库时,使用foo1,foo2函数名。
GCC 中文手册
GCC中文手册NAMEgcc,g++-GNU工程的C和C++编译器(egcs-1.1.2)总览(SYNOPSIS)gcc[option|filename ]...g++[option|filename ]...警告(WARNING)本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件, Info 文件是权威文档.如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU工程认为man手册是过时产物,应该把时间用到别的地方.如果需要完整和最新的文档,请查阅Info文件`gcc'或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件 gcc.texinfo.描述(DESCRIPTION)C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定:gcc认为预处理后的文件(.i)是C文件,并且设定C形式的连接.g++认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.源文件后缀名指出语言种类以及后期的操作:.c C源程序;预处理,编译,汇编.C C++源程序;预处理,编译,汇编.cc C++源程序;预处理,编译,汇编.cxx C++源程序;预处理,编译,汇编.m Objective-C源程序;预处理,编译,汇编.i预处理后的C文件;编译,汇编.ii预处理后的C++文件;编译,汇编.s汇编语言源程序;汇编.S汇编语言源程序;预处理,汇编.h预处理器文件;通常不出现在命令行上其他后缀名的文件被传递给连接器(linker).通常包括:.o目标文件(Object file).a归档库文件(Archive file)除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是 最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器.选项(OPTIONS)选项必须分立给出: `-dr'完全不同于`-d -r '.大多数`-f'和`-W'选项有两个相反的格式: -f name和 -fno-name (或-W name和-Wno-name).这里 只列举不是默认选项的格式.下面是所有选项的摘要,按类型分组,解释放在后面的章节中.总体选项(Overall Option)-c -S -E -o file -pipe -v -x language语言选项(Language Option)-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs警告选项(Warning Option)-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings调试选项(Debugging Option)-a -d letters -fpretend-float -g -g level -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program优化选项(Optimization Option)-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3预处理器选项(Preprocessor Option)-A assertion -C -dD -dM -dN -D macro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -U macro -undef汇编器选项(Assembler Option)-Wa,option连接器选项(Linker Option)-l library -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol目录选项(Directory Option)-B prefix -I dir -I- -L dir目标机选项(Target Option)-b machine -V version配置相关选项(Configuration Dependent Option)M680x0 选项-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-floatVAX选项-mg -mgnu -munixSPARC选项-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypressConvex选项-margcount -mc1 -mc2 -mnoargcountAMD29K选项-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registersM88K选项-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structsRS6000选项-mfp-in-toc -mno-fop-in-tocRT选项-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return MIPS选项-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocppi386选项-m486 -mno-486 -msoft-float -mno-fp-ret-in-387HPPA选项-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-coloni960选项-m cpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-alignDEC Alpha选项-mfp-regs -mno-fp-regs -mno-soft-float -msoft-floatSystem V选项-G -Qy -Qn -YP,paths -Ym,dir代码生成选项(Code Generation Option)-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm总体选项(Overall Option)-x language明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面所有的输入文件,直到遇着下一个`-x'选项. language的可选值有`c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`assembler-with-cpp'. -x none关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x'选项).如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x'选项(或文件名后缀)告诉 gcc从哪里开始,用`-c', `-S',或`-E'选项告诉gcc到 哪里结束.注意,某些选项组合(例如, `-x cpp-output -E')使gcc不作任何事情.-c编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i', `.s',等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).-S编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i',等等,产生 目标文件名.可以使用-o 选项选择其他名字.GCC忽略任何不需要编译的输入文件.-E预处理后即停止,不进行编译.预处理后的代码送往标准输出.GCC忽略任何不需要预处理的输入文件.-o file指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码.由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o'选项没有意义,除非输出一个可执行文件.如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out', `source.suffix '的目标文件是`source.o',汇编文件是 `source.s',而预处理后的C源代码送往标准输出.-v(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.-pipe在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的汇编器不能从管道读取数据. GNU的汇编器没有这个问题.语言选项(LANGUAGE OPTIONS)下列选项控制编译器能够接受的C "方言":-ansi支持符合ANSI标准的C程序.这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启 不受欢迎和极少使用的ANSI trigraph 特性,以及禁止`$'成为标识符的一部分.尽管使用了`-ansi'选项,下面这些可选的关键字, __asm__, __extension__, __inline__和__typeof__仍然有效.你当然不会把 他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi'选项.另外一些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi'选项,始终有效.使用`-ansi'选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic'选项作为 `-ansi'选项的补充.使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件 关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方 使用这些名字的程序了.-fno-asm不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用__asm__,__inline__和__typeof__能够替代他们. `-ansi' 隐含声明了`-fno-asm'.-fno-builtin不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit,abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt,strcmp, strcpy,和strlen.`-ansi'选项能够阻止alloca和_exit成为内建函数.-fhosted按宿主环境编译;他隐含声明了`-fbuiltin'选项,而且警告不正确的main函数声明.-ffreestanding按独立环境编译;他隐含声明了`-fno-builtin'选项,而且对main函数没有特别要求.(译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个int值,典型例子是除了 内核以外几乎所有的程序.对应的独立环境(freestanding environment)不存在标准库,程序入口也不一定是 main,最明显的例子就是操作系统内核.详情参考gcc网站最近的资料)-fno-strict-prototype对于没有参数的函数声明,例如`int foo ();',按C风格处理---即不说明参数个数或类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.-trigraphs支持ANSI C trigraphs. `-ansi'选项隐含声明了`-trigraphs'.-traditional试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除,这样当内容过时后,人们也不会埋怨我们.除了一件事:对于C++程序(不是C), `-traditional'选项带来一个附加效应,允许对 this赋值.他和`-fthis-is-variable'选项的效果一样.-traditional-cpp试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包括`-traditional'选项的其他效应.-fdollars-in-identifiers允许在标识符(identifier)中使用`$'字符(仅针对C++).你可以指定`-fno-dollars-in-identifiers'选项显明禁止使用`$'符. (GNU C++在某些目标系统缺省允许`$'符,但不是所有系统.)-fenum-int-equiv允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C++允许从enum到int的转换,反之则不行.-fexternal-templates为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个模板函数(template function),只在定义他们的地方生成一个副本.想要成功使用这个选项,你必须在所有使用模板的文件中,标记`#pragma implementation' (定义)或`#pragmainterface' (声明).当程序用`-fexternal-templates'编译时,模板实例(template instantiation) 全部是外部类型.你必须让需要的实例在实现文件中出现.可以通过typedef实现这一点,他引用所需的每个 实例.相对应的,如果编译时使用缺省选项`-fno-external-templates',所有模板实例明确的设为内置.-fall-virtual所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或delete成员操作符)视为所在类的虚函数.这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出可以直接调用某个虚函数;这时就 直接调用.-fcond-mismatch允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.-fthis-is-variable允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值的`this'显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作.然而为了向后兼容,你可以通过`-fthis-is-variable'选项使这种操作有效.-funsigned-char把char定义为无符号类型,如同unsigned char.各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char .理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或者无符号数,具体情况取决于 编写程序的目标机器).这个选项,和它的反义选项,使那样的程序工作在对应的默认值上.char的类型始终应该明确定义为signed char或unsigned char,即使 它表现的和其中之一完全一样.-fsigned-char把char定义为有符号类型,如同signed char.这个选项等同于`-fno-unsigned-char',他是the negative form of `-funsigned-char'的相反选项.同样, `-fno-signed-char'等价于 `-funsigned-char'.-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域(bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型,如int,是有符号数.然而,如果指定了`-traditional'选项,位域永远是无符号数.-fwritable-strings把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假设字符串常量是可写的. `-traditional'选项也有相同效果.篡改字符串常量是一个非常糟糕的想法; ``常量''就应该是常量.预处理器选项(Preprocessor Option)下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`-E'选项一起才 有意义,因为他们的输出结果不能用于编译.-include file在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在命令行上的顺序如何.然而`-include'和`-imacros'选项按书写顺序处理.-imacros file在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件file的输出内容, `-imacros file'选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacros file'选项之前,预处理器首先处理`-D' 和`-U'选项,并不在乎他们在命令行上的顺序.然而`-include'和`-imacros'选项按书写顺序处理.-idirafter dir把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I'添加的路径)中没有找到,预处理器就搜索第二包含路径.-iprefix prefix指定prefix作为后续`-iwithprefix'选项的前缀.-iwithprefix dir把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里prefix被先前的`-iprefix'选项指定.-nostdinc不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果合适).结合使用`-nostdinc'和`-I-'选项,你可以把包含文件搜索限制在显式指定的目录.-nostdinc++不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++'时使用这个选项.)-undef不要预定义任何非标准宏. (包括系统结构标志).-E仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.-C告诉预处理器不要丢弃注释.配合`-E'选项使用.-P告诉预处理器不要产生`#line'命令.配合`-E'选项使用.-M [ -MG ]告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中`#include引用的所有文件.生成的规则可以是单行,但如果太长,就用`\'-换行符续成多行.规则显示在标准输出,不产生预处理过的C程序.`-M'隐含了`-E'选项.`-MG'要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必须和 `-M'选项一起用.-MM [ -MG ]和`-M'选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"'.忽略系统头文件如`#include <file>'.-MD和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o'替换为`.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常的编译任务.Mach的实用工具`md'能够合并`.d'文件,产生适用于`make'命令的单一的 依赖文件.-MMD和`-MD'选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.-H除了其他普通的操作, GCC显示引用过的头文件名.-A question(answer)如果预处理器做条件测试,如`#if #question(answer)',该选项可以断言(Assert)question的答案是answer.-A-'关闭一般用于描述目标机的标准断言.-D macro定义宏macro,宏的内容定义为字符串`1'.-D macro=defn定义宏macro的内容为defn.命令行上所有的`-D'选项在`-U'选项之前处理.-U macro取消宏macro. `-U'选项在所有的`-D'选项之后处理,但是优先于任何`-include'或`-imacros'选项.-dM告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E'选项使用.-dD告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.-dN和`-dD'选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.汇编器选项(ASSEMBLER OPTION)-Wa,option把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.连接器选项(LINKER OPTION)下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行连接,他们就毫无意义. object-file-name如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为他们是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果GCC执行连接操作,这些目标文件将成为连接器的输入文件.-l library连接名为library的库文件.连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`lib library.a'.连接器会 当做文件名得到准确说明一样引用这个文件.搜索目录除了一些系统标准目录外,还包括用户以`-L'选项指定的路径.一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接器处理归档文件的 方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的 目标文件,而不是库文件,就把这个目标文件按平常方式连接进来.指定`-l'选项和指定文件名的唯一区别是, `-l选项用`lib'和`.a'把library包裹起来,而且搜索一些目录.-lobjc这个-l选项的特殊形式用于连接Objective C程序.-nostartfiles不连接系统标准启动文件,而标准库文件仍然正常使用.-nostdlib不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.-static在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效.-shared生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.-symbolic建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警告(除非用连接编辑选项`-Xlinker -z -Xlinker defs'取代).只有部分系统支持该选项.-Xlinker option把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别这些选项.如果需要传递携带参数的选项,你必须使用两次`-Xlinker',一次传递选项,另一次传递他的参数. 例如,如果传递`-assert definitions',你必须写成`-Xlinker -assert -Xlinker definitions',而不能写成`-Xlinker "-assert definitions"',因为这样会把整个 字符串当做一个参数传递,显然这不是连接器期待的.-Wl,option把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项.-u symbol使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多个`-u'选项,各自跟上不同的符号,使得连接器调入附加的库模块.目录选项(DIRECTORY OPTION)下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:-I dir在头文件的搜索路径列表中添加dir 目录.-I-任何在`-I-'前面用`-I'选项指定的搜索路径只适用于`#include "file"'这种情况;他们不能用来搜索`#include <file>'包含的头文件.如果用`-I'选项指定的搜索路径位于`-I-'选项后面,就可以在这些路径中搜索所有的`#include'指令. (一般说来-I选项就是这么用的.)还有, `-I-'选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"'的第一选择.没有办法克服`-I-'选项的这个效应.你可以指定 `-I.'搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常 令人满意.`-I-'不影响使用系统标准目录,因此, `-I-'和`-nostdinc'是不同的选项.-L dir在`-l'选项的搜索路径列表中添加dir目录.-B prefix这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.编译器驱动程序需要执行某些下面的子程序: `cpp', `cc1' (或C++的 `cc1plus'), `as'和`ld'.他把prefix当作欲执行的程序的 前缀,既可以包括也可以不包括`machine/version/'.对于要运行的子程序,编译器驱动程序首先试着加上`-B'前缀(如果存在).如果没有找到文件,或没有指定 `-B'选项,编译器接着会试验两个标准前缀`/usr/lib/gcc/'和 `/usr/local/lib/gcc-lib/'.如果仍然没能够找到所需文件,编译器就在`PATH'环境变量 指定的路径中寻找没加任何前缀的文件名.如果有需要,运行时(run-time)支持文件`libgcc.a'也在`-B'前缀的搜索范围之内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数 情况的多数机器上, `libgcc.a'并非必不可少.你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的 一样用做前缀.如果同时指定了`-B'选项和GCC_EXEC_PREFIX变量,编译器首先使用 `-B'选项,然后才尝试环境变量值.警告选项(WARNING OPTION)警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.下列选项控制GNU CC产生的警告的数量和类型:-fsyntax-only检查程序中的语法错误,但是不产生输出信息.-w禁止所有警告信息.-Wno-import禁止所有关于#import的警告信息.-pedantic打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi' 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.使用这个选项可以拒绝这些程序.没有理由 使用这个选项,他存在只是为了满足一些书呆子(pedant).对于替选关键字(他们以`__'开始和结束) `-pedantic'不会产生警告信息. Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好 避免.-pedantic-errors该选项和`-pedantic'类似,但是显示错误而不是警告.-W对下列事件显示额外的警告信息:*非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生.编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个 信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题 的地方调用longjmp.*既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:foo (a){if (a > 0)return a;}由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现虚假警告.*表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换为void类型.例如,这样的表达式`x[i,j]'会导致警告,而`x[(void)i,j]'就不会.*无符号数用`>'或`<='和零做比较.-Wimplicit-int警告没有指定类型的声明.-Wimplicit-function-declaration警告在声明之前就使用的函数.-Wimplicit同-Wimplicit-int和-Wimplicit-function-declaration.-Wmain如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数用于外部连接, 返回int数值,不需要参数,或指定两个参数.-Wreturn-type如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不带返回值的return语句,如果他们所属的函数并非void类型.-Wunused如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.-Wswitch如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的case语句同样会导致这个警告.-Wcomment如果注释起始序列`/*'出现在注释中,编译器就发出警告.-Wtrigraphs警告任何出现的trigraph (假设允许使用他们).-Wformat检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致.-Wchar-subscripts警告类型是char的数组下标.这是常见错误,程序员经常忘记在某些机器上char有符号.-Wuninitialized在初始化之前就使用自动变量.这些警告只可能做优化编译时出现,因为他们需要数据流信息,只有做优化的时候才估算数据流信息.如果不指定 `-O'选项,就不会出现这些警告.这些警告仅针对等候分配寄存器的变量.因此不会发生在声明为volatile的变量上面,不会发生在已经 取得地址的变量,或长度不等于1, 2, 4, 8字节的变量.同样也不会发生在结构,联合或数组上面,即使他们在 寄存器中.注意,如果某个变量只计算了一个从未使用过的值,这里可能不会警告.因为在显示警告之前,这样的计算已经被 数据流分析删除了.这些警告作为可选项是因为GNU CC还没有智能到判别所有的情况,知道有些看上去错误的代码其实是正确的.下面是 一个这样的例子:{int x;switch (y){case 1: x = 1;break;case 2: x = 4;break;case 3: x = 5;}foo (x);。
gcc中文参考大全
GCC技术参考大全GCC (GNU Compiler Collection ,GNU 编译程序集合)是最重要的开放源码软件。
事实上,其他所有开放源码软件都在某种层次上依赖于它。
甚至其他语言,例如Perl 和Python ,都是由C 语言开发的,由GNU 编译程序编译的。
GCC 编译程序的历史很有趣,远远不止是一个时间和事件的列表。
这个软件对于整个自由软件运动而言具有根本性的意义。
事实上,如果没有它或类似的软件,就不可能有自由软件运动。
GCC 为Linux 的出现提供了可能性。
本章概要介绍了GCC 编译程序集合,以及它的相关工具。
这些编译中使用的工具可以跟踪源代码、编辑文件、控制编译过程、提供调试信息。
本章介绍的内容包括一个列表以及对处理过程的一些描述。
该列表描述了组成编译程序集合的文件和程序。
之后介绍了将源文件变成可连接和可执行程序的步骤。
1.1 GNUGCC 是GNU 项目的一个产品。
该项目始于1984 年,目标是以自由软件的形式开发一个完整的类UNIX 的操作系统。
像所有这种规模的软件一样,GNU 项目也经历了一些波折,但目标最终还是实现了。
实际上现在一个功能完备的类UNIX 操作系统—— Linux ,已经在世界上广为流传了,并被不计其数的公司、政府和个人成功应用。
而该系统及其所有工具和应用都是基于GCC 的。
可用于Linux 以及其他系统的自由软件的范围很广泛,并且还在日益增长。
作为整体GNU 项目的一部分而开发的免费UNIX 被列在中的自由软件目录(Free Software Directory )中。
成千上万的程序员都在为各种GNU 项目(及其他自由软件项目)作贡献,而实际上所有这些都在某种程度上依赖于GCC 。
1.2 测量编译程序我们可以在编译的速度、生成代码的速度,以及生成代码的尺寸上对编译程序进行比较。
但是很难进行更深入的比较,因为虽然可以得出一些数字,却很难对这些数字赋予某种实际意义。
gnu make 中文
GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux 的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件。
目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3.79)版原文,在此基础上翻译了该手册,以满足对Linux 源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。
本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E-mail为:yfc70@ 。
注意在文章中出现的斜体加粗字表示章节。
GNU make Version 3.79April 2000Richard M. Stallman and Roland McGrath目录1 make概述1.1 怎样阅读本手册1.2 问题和BUG2 Makefile文件介绍2.1 规则的格式2.2一个简单的Makefile文件2.3make处理Makefile文件的过程2.4使用变量简化Makefile文件2.5让make推断命令2.6另一种风格的Makefile文件2.7在目录中删除文件的规则3编写Makefile文件3.1Makefile文件的内容3.2Makefile文件的命名3.3包含其它的Makefile文件3.4变量MAKEFILES3.5Makefile文件重新生成的过程3.6重载其它Makefile文件3.7make读取Makefile文件的过程4 编写规则4.1规则的语法4.2在文件名中使用通配符4.2.1通配符例子4.2.2使用通配符的常见错误4.2.3函数wildcard4.3在目录中搜寻依赖4.3.1VPATH:所有依赖的搜寻路径4.3.2vpath指令4.3.3目录搜寻过程4.3.4编写搜寻目录的shell命令4.3.5目录搜寻和隐含规则4.3.6连接库的搜寻目录4.4假想目标4.5没有命令或依赖的规则4.6使用空目录文件记录事件4.7内建的特殊目标名4.8具有多个目标的规则4.9具有多条规则的目标4.10静态格式规则4.10.1静态格式规则的语法4.10.2静态格式规则和隐含规则4.11双冒号规则4.12自动生成依赖5 在规则中使用命令5.1命令回显5.2执行命令5.3并行执行5.4命令错误5.5中断或关闭make5.6递归调用make5.6.1变量MAKE的工作方式5.6.2与子make通讯的变量5.6.3与子make通讯的选项5.6.4`--print-directory'选项5.7定义固定次序命令5.8使用空命令6使用变量6.1变量引用基础6.2变量的两个特色6.3变量高级引用技术6.3.1替换引用6.3.2嵌套变量引用6.4变量取值6.5设置变量6.6为变量值追加文本6.7override指令6.8定义多行变量6.9环境变量6.10特定目标变量的值6.11特定格式变量的值7 Makefile文件的条件语句7.1条件语句的例子7.2条件语句的语法7.3测试标志的条件语句8 文本转换函数8.1函数调用语法8.2字符串替换和分析函数8.3文件名函数8.4函数foreach8.5函数if8.6函数call8.7函数origin8.8函数shell8.9控制Make的函数9运行make9.1指定Makefile文件的参数9.2指定最终目标的参数9.3代替执行命令9.4避免重新编译文件9.5变量重载9.6测试编译程序9.7选项概要10 使用隐含规则10.1使用隐含规则10.2隐含规则目录10.3隐含规则使用的变量10.4隐含规则链10.5定义与重新定义格式规则10.5.1格式规则简介10.5.2格式规则的例子10.5.3自动变量10.5.4格式匹配10.5.5万用规则10.5.6删除隐含规则10.6定义最新类型的缺省规则10.7过时的后缀规则10.8隐含规则搜寻算法11 使用make更新档案文件11.1档案成员目标11.2档案成员目标的隐含规则11.2.1更新档案成员的符号索引表11.3使用档案的危险11.4档案文件的后缀规则12 GNU make的特点13 不兼容性和失去的特点14 Makefile文件惯例14.1makefile文件的通用惯例14.2makefile文件的工具14.3指定命令的变量14.4安装路径变量14.5用户标准目标14.6安装命令分类15快速参考16make产生的错误17复杂的Makefile文件例子附录 名词翻译对照表1 Make 概述Make 可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。
Gcc完全中文手册
Gcc中文手册本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件, Info文件是权威文档.如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU工程认为man手册是过时产物,应该把时间用到别的地方.如果需要完整和最新的文档,请查阅Info文件`gcc’或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件 gcc.texinfo.描述(DESCRIPTION)C 和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定:gcc认为预处理后的文件(.i)是C文件,并且设定C形式的连接.g++认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.源文件后缀名指出语言种类以及后期的操作:.c C源程序;预处理,编译,汇编.C C++源程序;预处理,编译,汇编.cc C++源程序;预处理,编译,汇编.cxx C++源程序;预处理,编译,汇编.m Objective-C源程序;预处理,编译,汇编.i 预处理后的C文件;编译,汇编.ii 预处理后的C++文件;编译,汇编.s 汇编语言源程序;汇编.S 汇编语言源程序;预处理,汇编.h 预处理器文件;通常不出现在命令行上其他后缀名的文件被传递给连接器(linker).通常包括:.o 目标文件(Object file).a 归档库文件(Archive file)除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器.选项(OPTIONS)选项必须分立给出: `-dr’完全不同于`-d -r ’.大多数`-f’和`-W’选项有两个相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).这里只列举不是默认选项的格式.下面是所有选项的摘要,按类型分组,解释放在后面的章节中.总体选项(Overall Option)-c -S -E -o file -pipe -v -x language语言选项(Language Option)-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv-fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding-fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char-fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs警告选项(Warning Option)-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align-Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat-Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline-Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs-Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow-Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs-Wuninitialized -Wunused -Wwrite-strings调试选项(Debugging Option)-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name-print-prog-name=program优化选项(Optimization Option)-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch-felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups-fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole-fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2-fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3预处理器选项(Preprocessor Option)-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef汇编器选项(Assembler Option)-Wa,option连接器选项(Linker Option)-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol目录选项(Directory Option)-Bprefix -Idir -I- -Ldir目标机选项(Target Option)-b machine -V version配置相关选项(Configuration Dependent Option)M680x0 选项-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa-mnobitfield -mrtd -mshort -msoft-floatVAX选项-mg -mgnu -munixSPARC选项-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8-msupersparc -mcypressConvex选项-margcount -mc1 -mc2 -mnoargcountAMD29K选项-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registersM88K选项-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift-midentify-revision -mno-check-zero-division -mno-ocs-debug-info-mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile-mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structsRS6000选项-mfp-in-toc -mno-fop-in-tocRT选项-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-returnMIPS选项-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile-msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocppi386选项-m486 -mno-486 -msoft-float -mno-fp-ret-in-387HPPA选项-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls-mdisable-fpregs -mdisable-indexing -mtrailing-coloni960选项-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-alignDEC Alpha选项-mfp-regs -mno-fp-regs -mno-soft-float -msoft-floatSystem V选项-G -Qy -Qn -YP,paths -Ym,dir代码生成选项(Code Generation Option)-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC-freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile-fvolatile-global -fverbose-asm总体选项-x language明确指出后面输入文件的语言为 language (而不是从文件名后缀得到的默认选择).这个选项应用于后面所有的输入文件,直到遇着下一个`-x’选项. language的可选值有`c’, `objective-c’,`c-header’, `c++’, `cpp-output’, `assembler’,和 `assembler-with-cpp’.-x none关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x’选项). 如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x’选项(或文件名后缀)告诉gcc从哪里开始,用`-c’, `-S’,或` -E’选项告诉gcc到哪里结束.注意,某些选项组合(例如, `-xcpp-output -E’)使gcc不作任何事情.-c编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件. 缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’, `.s’,等等,产生目标文件名.可以使用-o选项选择其他名字. GCC 忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).-S编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件. 缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’,等等,产生目标文件名.可以使用-o选项选择其他名字. GCC忽略任何不需要编译的输入文件.-E预处理后即停止,不进行编译.预处理后的代码送往标准输出. GCC忽略任何不需要预处理的输入文件.-o file指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码. 由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o’选项没有意义,除非输出一个可执行文件. 如果没有使用`-o’选项,默认的输出结果是:可执行文件为`a.out’,`source.suffix ’的目标文件是`source.o’,汇编文件是 `source.s’,而预处理后的C源代码送往标准输出.-v(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.-pipe在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的汇编器不能从管道读取数据. GNU的汇编器没有这个问题.语言选项下列选项控制编译器能够接受的C "方言":-ansi支持符合ANSI标准的C程序. 这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启不受欢迎和极少使用的ANSI trigraph特性,以及禁止`$’成为标识符的一部分. 尽管使用了`-ansi’选项,下面这些可选的关键字, __asm__, __extension__, __inline__和__typeof__仍然有效.你当然不会把他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi’选项.另外一些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi’选项,始终有效. 使用`-ansi’选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic’选项作为 `-ansi’选项的补充. 使用`-ansi’选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了.-fno-asm不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用 __asm__, __inline__和__typeof__能够替代他们. `-ansi’隐含声明了`-fno-asm’.-fno-builtin不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqr t, strcmp, strcpy,和 strlen. -ansi’选项能够阻止alloca和_exit成为内建函数.-fhosted按宿主环境编译;他隐含声明了`-fbuiltin’选项,而且警告不正确的main函数声明.-ffreestanding按独立环境编译;他隐含声明了`-fno-builtin’选项,而且对main函数没有特别要求. (译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个int值,典型例子是除了内核以外几乎所有的程序. 对应的独立环境(freestanding environment)不存在标准库,程序入口也不一定是main,最明显的例子就是操作系统内核.详情参考gcc网站最近的资料)-fno-strict-prototype对于没有参数的函数声明,例如`int foo ();’,按C风格处理---即不说明参数个数或类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.-trigraphs支持ANSI C trigraphs. `-ansi’选项隐含声明了`-trigraphs’.-traditional试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除,这样当内容过时后,人们也不会埋怨我们. 除了一件事:对于C++程序(不是C), `-traditional’选项带来一个附加效应,允许对 this赋值.他和`-fthis-is-variable’选项的效果一样.-traditional-cpp试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包括`-traditional’选项的其他效应.-fdollars-in-identifiers允许在标识符(identifier)中使用`$’字符(仅针对C++).你可以指定`-fno-dollars-in-identifiers’选项显明禁止使用`$’符. (GNU C++在某些目标系统缺省允许`$’符,但不是所有系统.)-fenum-int-equiv允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C++允许从 enum到int的转换,反之则不行.-fexternal-templates为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个模板函数(template function),只在定义他们的地方生成一个副本.想要成功使用这个选项,你必须在所有使用模板的文件中,标记 `#pragma implementation’ (定义)或`#pragma interface’ (声明). 当程序用`- fexternal-templates’编译时,模板实例(template instantiation) 全部是外部类型.你必须让需要的实例在实现文件中出现.可以通过typedef实现这一点,他引用所需的每个实例.相对应的,如果编译时使用缺省选项`-fno-external- templates’,所有模板实例明确的设为内置.-fall-virtual所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或delete 成员操作符)视为所在类的虚函数. 这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出可以直接调用某个虚函数;这时就直接调用.-fcond-mismatch允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.-fthis-is-variable允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值的 `this’显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作.然而为了向后兼容,你可以通过`-fthis-is-variable’选项使这种操作有效.-funsigned-char把char定义为无符号类型,如同unsigned char. 各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char. 理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的 char,并且期待这是有符号数(或者无符号数,具体情况取决于编写程序的目标机器).这个选项,和它的反义选项,使那样的程序工作在对应的默认值上. char的类型始终应该明确定义为signed char或unsigned char,即使它表现的和其中之一完全一样.-fsigned-char把char定义为有符号类型,如同signed char. 这个选项等同于`-fno-unsigned-char’,他是the negative form of `-funsigned-char’的相反选项.同样, `-fno-signed-char’等价于`-funsigned-char’.-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields如果没有明确声明`signed’或`unsigned’修饰符,这些选项用来定义有符号位域 (bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型,如int,是有符号数. 然而,如果指定了`-traditional’选项,位域永远是无符号数.-fwritable-strings把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假设字符串常量是可写的. `-traditional’选项也有相同效果. 篡改字符串常量是一个非常糟糕的想法; ``常量’’就应该是常量.预处理器选项下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.如果指定了`-E’选项, GCC只进行预处理工作.下面的某些选项必须和`-E’选项一起才有意义,因为他们的输出结果不能用于编译.-include file在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D’和`-U’选项永远在`- include file’之前处理, 无论他们在命令行上的顺序如何.然而`-include’和`-imacros’选项按书写顺序处理.-imacros file在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件file的输出内容, `-imacros file’选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacrosfile’选项之前,预处理器首先处理`-D’和`-U’选项, 并不在乎他们在命令行上的顺序.然而`-include’和 `-imacros’选项按书写顺序处理.-idirafter dir把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I’添加的路径)中没有找到,预处理器就搜索第二包含路径.-iprefix prefix指定prefix作为后续`-iwithprefix’选项的前缀.-iwithprefix dir把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里 prefix被先前的`-iprefix’选项指定.-nostdinc不要在标准系统目录中寻找头文件.只搜索`-I’选项指定的目录(以及当前目录,如果合适). 结合使用`-nostdinc’和`-I-’选项,你可以把包含文件搜索限制在显式指定的目录.-nostdinc++不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++’时使用这个选项.)-undef不要预定义任何非标准宏. (包括系统结构标志).-E仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.-C告诉预处理器不要丢弃注释.配合`-E’选项使用.-P告诉预处理器不要产生`#line’命令.配合`-E’选项使用.-M [ -MG ]告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,预处理器输出一个make规则,该规则的目标项 (target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件.生成的规则可以是单行,但如果太长,就用`\’-换行符续成多行.规则显示在标准输出,不产生预处理过的C程序. -M’隐含了`-E’选项.-MG’要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必须和 `-M’选项一起用.-MM [ -MG ]和`-M’选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"’.忽略系统头文件如`#include <file>’.-MD和`-M’选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o’替换为 `.d’产生.同时继续指定的编译工作---`-MD’不象`-M’那样阻止正常的编译任务. Mach的实用工具`md’能够合并`.d’文件,产生适用于`make’命令的单一的依赖文件.-MMD和`-MD’选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.-H除了其他普通的操作, GCC显示引用过的头文件名.-Aquestion(answer)如果预处理器做条件测试,如`#if #question(answer)’,该选项可以断言(Assert) question的答案是answer. -A-’关闭一般用于描述目标机的标准断言.-Dmacro定义宏macro,宏的内容定义为字符串`1’.-Dmacro=defn定义宏macro的内容为defn.命令行上所有的`-D’选项在 `-U’选项之前处理.-Umacro取消宏macro. `-U’选项在所有的`-D’选项之后处理,但是优先于任何 `-include’或`-imacros’选项.-dM告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E’选项使用.-dD告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.-dN和`-dD’选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.汇编器选项-Wa,option把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.连接器选项下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行连接,他们就毫无意义.object-file-name如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为他们是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果GCC执行连接操作,这些目标文件将成为连接器的输入文件.-llibrary连接名为library的库文件.连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a’.连接器会当做文件名得到准确说明一样引用这个文件.搜索目录除了一些系统标准目录外,还包括用户以`-L’选项指定的路径. 一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的目标文件,而不是库文件,就把这个目标文件按平常方式连接进来. 指定`-l’选项和指定文件名的唯一区别是, `-l选项用`lib’和`.a’把library包裹起来,而且搜索一些目录.-lobjc这个-l选项的特殊形式用于连接Objective C程序.-nostartfiles不连接系统标准启动文件,而标准库文件仍然正常使用.-nostdlib不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.-static在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效.-shared生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.-symbolic建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs’取代).只有部分系统支持该选项.-Xlinker option把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别这些选项. 如果需要传递携带参数的选项,你必须使用两次`-Xlinker’,一次传递选项,另一次传递他的参数. 例如,如果传递`- assert definitions’,你必须写成`-Xlinker -assert -Xlinker definitions’,而不能写成`- Xlinker "-assert definitions"’,因为这样会把整个字符串当做一个参数传递,显然这不是连接器期待的.-Wl,option把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项.-u symbol使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多个 `-u’选项,各自跟上不同的符号,使得连接器调入附加的库模块.目录选项(DIRECTORY OPTION)下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:-Idir在头文件的搜索路径列表中添加dir 目录.-I-任何在`-I-’前面用`-I’选项指定的搜索路径只适用于`#include "file"’这种情况;他们不能用来搜索`#include <file>’包含的头文件. 如果用`-I’选项指定的搜索路径位于`-I-’选项后面,就可以在这些路径中搜索所有的 `#include’指令. (一般说来-I选项就是这么用的.) 还有, `-I-’选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"’的第一选择.没有办法克服`-I-’选项的这个效应.你可以指定 `-I.’搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常令人满意.`-I-’不影响使用系统标准目录,因此, `-I-’和`-nostdinc’是不同的选项.-Ldir在`-l’选项的搜索路径列表中添加dir目录.-Bprefix这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件. 编译器驱动程序需要执行某些下面的子程序: `cpp’, `cc1’ (或C++的 `cc1plus’), `as’和`ld’.他把prefix当作欲执行的程序的前缀,既可以包括也可以不包括`machine/version/’. 对于要运行的子程序,编译器驱动程序首先试着加上`-B’前缀(如果存在).如果没有找到文件,或没有指定 `-B’选项,编译器接着会试验两个标准前缀 `/usr/lib/gcc/’和 `/usr/local/lib/gcc-lib/’.如果仍然没能够找到所需文件,编译器就在`PATH’环境变量指定的路径中寻找没加任何前缀的文件名. 如果有需要,运行时(run-time)支持文件`libgcc.a’也在`-B’前缀的搜索范围之内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数情况的多数机器上,`libgcc.a’并非必不可少. 你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的一样用做前缀.如果同时指定了`-B’选项和GCC_EXEC_PREFIX变量,编译器首先使用 `-B’选项,然后才尝试环境变量值.警告选项警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.下列选项控制GNU CC产生的警告的数量和类型:-fsyntax-only检查程序中的语法错误,但是不产生输出信息.-w禁止所有警告信息.-Wno-import禁止所有关于#import的警告信息.-pedantic打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序. 无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi’选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.使用这个选项可以拒绝这些程序.没有理由使用这个选项,他存在只是为了满足一些书呆子(pedant). 对于替选关键字(他们以`__’开始和结束) `-pedantic’不会产生警告信息. Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好避免.-pedantic-errors该选项和`-pedantic’类似,但是显示错误而不是警告.-W对下列事件显示额外的警告信息: * 非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生.编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题的地方调用longjmp. * 既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:foo (a){if (a > 0)return a;}由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现虚假警告. * 表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换为void类型.例如,这样的表达式`x[i,j]’会导致警告,而`x[(void)i,j]’就不会. * 无符号数用`>’或`<=’和零做比较.-Wimplicit-int警告没有指定类型的声明.-Wimplicit-function-declaration警告在声明之前就使用的函数.-Wimplicit同-Wimplicit-int和-Wimplicit-function-declaration.-Wmain如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数用于外部连接, 返回int数值,不需要参数,或指定两个参数.-Wreturn-type如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不带返回值的return语句,如果他们所属的函数并非void类型.-Wunused如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.-Wswitch如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的case语句同样会导致这个警告.-Wcomment如果注释起始序列`/*’出现在注释中,编译器就发出警告.-Wtrigraphs警告任何出现的trigraph (假设允许使用他们).-Wformat检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致.-Wchar-subscripts警告类型是char的数组下标.这是常见错误,程序员经常忘记在某些机器上char有符号.-Wuninitialized在初始化之前就使用自动变量.这些警告只可能做优化编译时出现,因为他们需要数据流信息,只有做优化的时候才估算数据流信息.如果不指定 `-O’选项,就不会出现这些警告. 这些警告仅针对等候分配寄存器的变量.因此不会发生在声明为volatile的变量上面,不会发生在已经取得地址的变量,或长度不等于1, 2, 4, 8字节的变量.同样也不会发生在结构,联合或数组上面,即使他们在寄存器中. 注意,如果某个变量只计算了一个从未使用过的值,这里可能不会警告.因为在显示警告之前,这样的计算已经被数据流分析删除了. 这些警告作为可选项是因为GNU CC还没有智能到判别所有的情况,知道有些看上去错误的代码其实是正确的.下面是一个这样的例子:{int x;switch (y)。
gcc的使用
GCC使用手册作者:Clock1.前言GCC编译器的手册(GCC MANUAL)的英文版已经非常全面,并且结构也非常完善了,只是一直都没有中文的版本,我这次阅读了GCC编译器的主要内容,对手册的内容进行了结构性的了解,认为有必要对这次阅读的内容进行整理,为以后的工作做准备。
由于我对这个英文手册的阅读也仅仅是结构性的。
因此有很多地方并没有看,所以这篇文档的内容我也只能写出部分,对于以后需要详细了解的地方,会再往这篇文档中增添内容,需要增添的内容主要是编译器的各种开关。
2. 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步:a.预处理,把预处理命令扫描处理完毕;b.编译,把预处理后的结果编译成汇编或者目标模块;c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;d.连接,把多个目标代码模块连接生成一个大的目标模块;3. GCC开关GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。
3.1. 全局开关(OVERALL OPTIONS)全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。
An_Introduction_to_GCC_中文
GCC编程简介for the GNU Compilers gcc and g++ 作者:Brian Gough译者:Walter Zhou作序:Richard M. Stallman序言本序言由热心的Richard M. Stallman贡献,他是GCC的原始作者和GNU项目的奠基者。
本书是GCC(GNU Compiler Collection,GNU编译器集合)的入门教程,它将教会你怎样使用GCC 这个编程工具。
是的,GCC是个编程工具,但它不仅止此。
对计算机用户而言,它也是20年自由运动的一部分。
我们都想要好的软件,但对软件而言“好”意味着什么呢?简便的特征和可靠性是技术意义上的“好”,但这是不够的。
好的软件必须在道德伦理上也是好的:它必须尊重用户的自由。
作为一个软件用户,你有权按你认为合适的方式运行它,有权研究源代码并按你认为合适的方式进行修改,有权发行软件的拷贝给其他人,有权公布修改版本以便贡献给建立中的自由软件社区。
当一个程序用这种方式尊重你的自由时,我们称其为自由软件。
在GCC出现以前,已经有了另外的C,Fortran,Ada等编译器,但它们都不是自由软件。
你不能够自由地使用它们。
我编写GCC,以便我无需放弃我的自由就可以使用编译器。
仅仅有编译器对使用计算机系统而言是不够的,你需要整个操作系统。
在1983年时,现代计算机的所有操作系统都不是自由的。
为了有所补救,我于1984年开始开发GNU操作系统,一个属于自由软件的类Unix系统。
开发GCC只是开发GNU项目的一部分。
到90年代早期,接近完成的GNU操作系统由于Linux内核的加入而完整了。
Linux是在1992年成为自由软件的。
GNU/Linux组合而成的操作系统使得达成这样一个目标成为可能:自由地使用计算机。
但自由从来不会自动地保护你,我们需要工作来保卫它。
自由软件运动需要你的支持。
Richard M. Stallman2004年2月介绍本书的目的是介绍GNU C和C++编译器(gcc和g++)的用法。
gcc编译c,printf输出中文乱码
gcc编译c,printf输出中文乱码
在使用gcc编译C语言程序时,如果在printf语句中输出中文字符,有时会出现乱码的情况。
这是因为在C语言中,字符默认使用ASCII码表示,而中文字符并不在ASCII码范围内。
因此,需要使用一些特殊的编码方式才能正确地输出中文字符。
在Linux系统中,可以使用utf-8编码来输出中文字符。
具体做法是在编译时加上编译选项“-finput-charset=utf-8
-fexec-charset=utf-8”,例如:
gcc -finput-charset=utf-8 -fexec-charset=utf-8 test.c -o test
这样就可以使用printf输出中文字符了,例如:
printf('你好,世界!
');
如果还是出现乱码的情况,可能是因为终端的字符集不是utf-8,可以在终端中执行命令“locale”查看当前的字符集,然后使用命令“export LANG=zh_CN.UTF-8”来设置终端的字符集为utf-8。
总之,要正确输出中文字符,需要注意编译选项和终端字符集的设置。
- 1 -。
GCC使用手册
GCC使用手册1前言GCC编译器的手册(GCC MANUAL)的英文版已经非常全面,并且结构也非常完善了,只是一直都没有中文的版本,我这次阅读了GCC编译器的主要内容,对手册的内容进行了结构性的了解,认为有必要对这次阅读的内容进行整理,为以后的工作做准备。
由于我对这个英文手册的阅读也仅仅是结构性的。
因此有很多地方并没有看,所以这篇文档的内容我也只能写出部分,对于以后需要详细了解的地方,会再往这篇文档中增添内容,需要增添的内容主要是编译器的各种开关。
2GCC功能介绍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步:a.预处理,把预处理命令扫描处理完毕;b.编译,把预处理后的结果编译成汇编或者目标模块;c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;d.连接,把多个目标代码模块连接生成一个大的目标模块;3GCC开关GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。
3.1 全局开关(OVERALL OPTIONS)全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。
ld中文手册完全版(带目录)
ld中文使用手册完全版(译)-1、概述 (4)2、命令行选项 (5)2.1、连接器提供大量的命令行选项, (5)2.2、连接脚本 (5)2.3、对于名称是单个字符的选项, (5)2.4、对于名称是多个字符的选项,选项前可以有一个或两个破折号; (5)2.5、多字符选项的参数 (5)2.5、注意,如果连接器通过,被编译器驱动来间接引用(比如GCC), (6)2.5.1、下面是关于被GNU连接器接受的常用命令行开关的一个列表: (6)`-aKEYWORD' (6)`-AARCHITECTURE' `--architecture=ARCHITECTURE' (6)`-b INPUT-formAT' `--format=INPUT-formAT' (6)`-d' `-dc' `-dp' (6)`-e ENTRY' `--entry=ENTRY' (6)`-E' `--export-dynamic' (7)`-EB'连接big-endian对象. 这会影响缺省输出格式 (7)`-EL'连接little-endian对象. 这会影响缺省输出格式. (7)`-g'忽略. 为了跟其它工具兼容而提供 (7)`-i'执行一个增量连接(跟'-r'等同) (7)`-init NAME' (7)`-lARCHIVE' `--library=ARCHIVE' (7)`-M' `--print-map' (7)`-n' `--nmagic', (7)`-N' `--omagic' (7)`--no-omagic' (7)`-o OUTPUT' `--output=OUTPUT' (7)`-O LEVEL' (7)`-q' `--emit-relocs' (8)`-r' `--relocateable' (8)`-R FILENAME' `--just-symbols=FILENAME' (8)`-s' `--strip-all',忽略输出文件中所有的符号信息 (8)`-S' `--strip-debug', (8)`-t' `--trace',打印ld 处理的所有输入文件的名字. (8)`-T SCRIPTFILE' `--script=SCRIPTFILE' (8)`-u SYMBOL' `--undefined=SYMBOL' (8)`-Ur' (8)`--unique[=SECTION]' (9)`-v'`--version' `-V', (9)`-x'`--discard-all'删除所有的本地符号 (9)`-X'`--discard-locals' (9)`-y SYMBOL'`--trace-symbol=SYMBOL' (9)`-Y PATH' (9)`-z KEYWORD' (9)`-( ARCHIVES -)'`--start-group ARCHIVES --end-group' (9)`--accept-unknown-input-arch'`--no-accept-unknown-input-arch' (10)`-assert KEYWORD'这个选项被忽略,只是用来跟SunOS保持兼容 (10)`-Bdynamic'`-dy'`-call_shared'连接动态链接库. (10)`-Bgroup' (10)'--no-undefined' (10)`-Bstatic'`-dn' `-non_shared' `-static' (10)`-Bsymbolic' (10)`--check-sections'`--no-check-sections' (10)`--cref' (10)`--no-define-common' (10)`--defsym SYMBOL=EXPRESSION' (10)`--demangle[=style]'`--no-demangle' (11)`--dynamic-linker FILE' (11)`--embedded-relocs' (11)`--fatal-warnings'把所有的警告视为错误 (11)`--force-exe-suffix'确保输出文件有一个.exe后缀 (11)`--no-gc-sections'`--gc-sections' (11)`--help'在标准输出上打印一个命令行选项概要,然后退出 (11)`--target-help' (11)`-Map MAPFILE' (11)`--no-keep-memory' (11)`--no-undefined'`-z defs' (11)`--allow-multiple-definition'`-z muldefs' (11)`--allow-shlib-undefined'`--no-allow-shlib-undefined' (12)`--no-undefined-version' (12)`--no-warn-mismatch' (12)`--no-whole-archive' (12)`--noinhibit-exec' (12)`-nostdlib' (12)`--oformat OUTPUT-formAT' (12)`-qmagic'这个选项被忽略,只是为了跟Linux保持兼容 (12)`-Qy'这个选项被忽略,只是为了跟SVR4保持兼容 (12)`--relax' (12)`--retain-symbols-file FILENAME' (12)'--retain-symbols-file' (13)`-rpath DIR' (13)`-rpath-link DIR' (13)`-shared'`-Bshareable' (13)`--sort-common' (13)`--split-by-file [SIZE]' (14)`--split-by-reloc [COUNT]' (14)`--stats' (14)`--traditional-format' (14)'--trafitinal-format'开关告诉ld 不要把相同的入口合并起来 (14)`--section-start SECTIONNAME=ORG' (14)`-Tbss ORG'`-Tdata ORG' `-Ttext ORG' (14)`--dll-verbose'`--verbose' (14)`--version-script=VERSION-SCRIPTFILE' (14)`--warn-common' (14)`--warn-constructors' (15)`--warn-multiple-gp' (15)`--warn-once' (15)`--warn-section-align' (15)`--whole-archive' (15)`--wrap SYMBOL' (16)`--enable-new-dtags'`--disable-new-dtags' (16)i386 PE平台的特定选项 (16)`--add-stdcall-alias' (16)`--base-file FILE' (16)`--enable-stdcall-fixup'`--disable-stdcall-fixup' (16)`--export-all-symbols' (17)3、环境变量 (17)`GNUTARGET' (17)`LDEMULATION' (17)4、连接脚本 (17)4.1、基本的连接脚本的概念 (17)4.2、连接脚本的格式 (18)4.3、简单的连接脚本示例 (18)4.4、简单的连接脚本命令. (19)4.4.1、设置入口点 (19)4.4.2、处理文件的命令. (19)`INCLUDE FILENAME' (19)`INPUT(FILE, FILE, ...)'`INPUT(FILE FILE ...)' .. (19)`GROUP(FILE, FILE, ...)'`GROUP(FILE FILE ...)'. (20)`OUTPUT(FILENAME)' (20)`SEARCH_DIR(PATH)' (20)`STARTUP(FILENAME)' (20)4.5、处理目标文件格式的命令 (20)`OUTPUT_formAT(BFDNAME)'`OUTPUT_formAT(DEFAULT, BIG, LITTLE)' (20)`TARGET(BFDNAME)' (20)4.6、其它的连接脚本命令. (21)`ASSERT(EXP, MESSAGE)' (21)`EXTERN(SYMBOL SYMBOL ...)'.. (21)`FORCE_COMMON_ALLOCATION' (21)`INHIBIT_COMMON_ALLOCATION' (21)`NOCROSSREFS(SECTION SECTION ...)' (21)`OUTPUT_ARCH(BFDARCH)' (21)4.6、为符号赋值 (21)4.7、SECTIONS命令 (22)4.7.1、输出节描述 (23)4.7.2、输出节名. (23)4.7.3、输出节描述 (23)4.7.4、输入节描述 (24)4.7.4.1、输入节通配符 (25)4.7.4.2、输入节中的普通符号. (25)4.7.4.3、输入节和垃圾收集 (26)4.7.5、输出节数据 (26)4.7.5.1、输出节关键字 (27)4.7.5.2、输出节的丢弃。
CodeBlocks中文版使用手册
G原手册下载:/docs/manual_en.pdf译者:JGood(/Jgood)译者言:工欲善其事,必先利其器。
一个好的工具能事半功倍。
写程序时,特别是写C++程序,大部分人脑子里想到的第一个工具就是VisualStudio。
不可否认,VS很好很强大,用户体验非常好。
但VisualStudio也是有缺点的:它非常庞大;只支持VC,不支持其他的编译器;VS只能在windows下跑,在其他os上就无用武之地;VS是要钱的,而且费用不非(Express版本免费)。
Code::Blocks是一个非常优秀的工具,如果您正在寻找VisualStudio之外的,开源、免费、轻便、支持多种编译器、跨平台的C/C++ IDE,那么Code::Blocks就是一个很好的选择。
说明:笔者打算用两篇日志来完成对Code::Blocks手册前二章的编译,分别是:使用篇、插件篇。
本文是第一篇:Code::Blocks使用篇。
原手册第三章介绍Code::Blocks变量、脚本的使用,第四章介绍如何从源码编译Code::Blocks,这两章内容不是很多,笔者认为对大部分用户帮助不是不大,暂不打算翻译。
笔者使用的Code::Block版本是nightly builds,svn6088(可以在这个地址下载:/index.php/topic,11875.0.html)。
使用的编译器是GCC3.4.5。
每个版本之间的使用可能会有细微的差别。
因为水平有限,难免出错,欢迎指正!Code::Blocks 手册Version 1.0感谢CodeBlocks项目组:Anders F. Bjorklund (afb), Biplab Kumar Modak (biplab), Bartomiej wiecki (byo), PaulA. Jimenez (ceniza), Koa Chong Gee (cyberkoa), Daniel Orb (daniel2000), Lieven de Cock(killerbot), Yiannis Mandravellos (mandrav), Mispunt (mispunt), Martin Halle (morten-macy), Jens Lody (jens), Jerome Antoine (dje), Damien Moore (dmoore), Pecan Heber(pecan), Ricardo Garcia (rickg22), Thomas Denk (thomasdenk), tiwag (tiwag)Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation.1 CodeBlocks项目管理下图是CodeBlocks运行时的用户界面:∙管理(Management):管理窗口包含Project视图与Symbols视图。
中文gcc手册
中文gcc手册GCC(GNU Compiler Collection)是一个流行的编译器,用于编译C、C++、Objective-C、Fortran、Ada等语言的程序。
GCC具有许多选项和功能,可以用来优化代码、控制警告和错误信息、进行调试等。
以下是一个中文版的GCC手册,介绍了GCC的一些常用选项和用法:1. 概述GCC是一个多功能的编译器,支持多种编程语言和平台。
它能够将源代码编译成可执行文件或库文件,并提供了一些优化、警告和错误检查功能。
2. 安装安装GCC需要先下载对应的版本,并按照安装向导的指引进行安装。
安装完成后,可以在命令行中输入“gcc --version”来检查是否安装成功。
3. 选项GCC有许多选项,可以通过在命令行中添加参数来启用。
以下是一些常用选项的说明:-c:只编译不链接,生成目标文件。
-o:指定输出文件的名称。
-g:生成调试信息,用于调试。
-O:优化代码,提高执行效率。
-Wall:显示所有警告信息。
-Werror:将所有警告视为错误。
4. 示例以下是一个简单的C程序示例,演示了如何使用GCC进行编译:```cinclude <>int main() {printf("Hello, world!\n");return 0;}```在命令行中输入以下命令进行编译:```shellgcc -o hello```该命令将源代码文件“”编译成可执行文件“hello”。
如果编译成功,可以在命令行中输入“./hello”来运行程序。
5. 调试GCC提供了调试选项,可以帮助开发者定位和解决问题。
常用的调试选项包括-g和-O。
使用-g选项可以生成调试信息,而-O选项则可以对代码进行优化。
在编译时,可以同时使用这两个选项来生成优化并带有调试信息的代码。
如果需要更深入的调试,可以使用GDB等调试工具来辅助分析。
6. 注意事项在使用GCC时,需要注意以下几点:确保已经正确安装了GCC,并且版本与源代码兼容。
GCC 中文手册
转载:GCC 中文手册(中)GCC 中文手册(中)选择自 Kendiv 的 Blog关键字 GCC 中文手册(中)出处:GCC 中文手册(中)-Wparentheses在某些情况下如果忽略了括号,编译器就发出警告.-Wtemplate-debugging当在C++程序中使用template的时候,如果调试(debugging)没有完全生效,编译器就发出警告. (仅用于C++).-Wall结合所有上述的`-W'选项.通常我们建议避免这些被警告的用法,我们相信,恰当结合宏的使用能够轻易避免这些用法。
剩下的`-W...'选项不包括在`-Wall'中,因为我们认为在必要情况下,这些被编译器警告的程序结构,可以合理的用在"干净的"程序中.-Wtraditional如果某些程序结构在传统C中的表现和ANSI C不同,编译器就发出警告.*宏参出现在宏体的字符串常量内部.传统C会替换宏参,而ANSI C则视其为常量的一部分.*某个函数在块(block)中声明为外部,但在块结束后才调用.*switch语句的操作数类型是long.-Wshadow一旦某个局部变量屏蔽了另一个局部变量,编译器就发出警告.-Wid-clash-len一旦两个确定的标识符具有相同的前len个字符,编译器就发出警告.他可以协助你开发一些将要在某些过时的,危害大脑的编译器上编译的程序.-Wpointer-arith任何语句如果依赖于函数类型的大小(size)或者void类型的大小,编译器就发出警告. GNU C为了便于计算void *指针和函数指针,就把这些类型的大小定义为1.-Wcast-qual一旦某个指针强制类型转换以便移除类型修饰符时,编译器就发出警告.例如,如果把const char * 强制转换为普通的char *时,警告就会出现.-Wcast-align一旦某个指针类型强制转换时,导致目标所需的地址对齐(alignment)增加,编译器就发出警告.例如,某些机器上只能在2或4字节边界上访问整数,如果在这种机型上把char *强制转换成int *类型, 编译器就发出警告.-Wwrite-strings规定字符串常量的类型是const char[length],因此,把这样的地址复制给 non-const char *指针将产生警告.这些警告能够帮助你在编译期间发现企图写入字符串常量的代码,但是你必须非常仔细的在声明和原形中使用const,否则他们只能带来麻烦;所以我们没有让 `-Wall'提供这些警告.-Wconversion如果某函数原形导致的类型转换和无函数原形时的类型转换不同,编译器就发出警告.这里包括定点数和浮点数的互相转换,改变定点数的宽度或符号,除非他们和缺省声明(default promotion)相同.-Waggregate-return如果定义或调用了返回结构或联合的函数,编译器就发出警告. (从语言角度你可以返回一个数组,然而同样会导致警告.)-Wstrict-prototypes如果函数的声明或定义没有指出参数类型,编译器就发出警告. (如果函数的前向引用说明指出了参数类型,则允许后面使用旧式风格的函数定义,而不会产生警告.)-Wmissing-prototypes如果没有预先声明函数原形就定义了全局函数,编译器就发出警告.即使函数定义自身提供了函数原形也会产生这个警告. 他的目的是检查没有在头文件中声明的全局函数.-Wmissing-declarations如果没有预先声明就定义了全局函数,编译器就发出警告.即使函数定义自身提供了函数原形也会产生这个警告.这个选项的目的是检查没有在头文件中声明的全局函数.-Wredundant-decls如果在同一个可见域某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别.-Wnested-externs如果某extern声明出现在函数内部,编译器就发出警告.-Wenum-clash对于不同枚举类型之间的转换发出警告(仅适用于C++).-Wlong-long如果使用了long long 类型就发出警告.该警告是缺省项.使用`-Wno-long-long' 选项能够防止这个警告. `-Wlong-long'和`-Wno-long-long'仅在 `-pedantic'之下才起作用.-Woverloaded-virtual(仅适用于C++.)在继承类中,虚函数的定义必须匹配虚函数在基类中声明的类型特征(type signature).当继承类声明了某个函数,它可能是个错误的尝试企图定义一个虚函数,使用这个选项能够产生警告:就是说,当某个函数和基类中的虚函数同名,但是类型特征不符合基类的任何虚函数,编译器将发出警告.-Winline如果某函数不能内嵌(inline),无论是声明为inline或者是指定了-finline-functions 选项,编译器都将发出警告.-Werror视警告为错误;出现任何警告即放弃编译.调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错:-g以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息. 在大多数使用stabs格式的系统上, `-g'选项启动只有GDB才使用的额外调试信息;这些信息使GDB 调试效果更好,但是有可能导致其他调试器崩溃,或拒绝读入程序.如果你确定要控制是否生成额外的信息, 使用`-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf+',或`-gdwarf' (见下文).和大多数C编译器不同, GNU CC允许结合使用`-g'和`-O'选项.优化的代码偶尔制造一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地方;某些语句因为计算结果是常量或已经确定而没有执行;某些语句在其他地方执行,因为他们被移到循环外面了.然而它证明了调试优化的输出是可能的.对可能含有错误的程序使用优化器是合理的.如果GNU CC支持输出多种调试信息,下面的选项则非常有用.-ggdb以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展.-gstabs以stabs格式(如果支持)输出调试信息,不包括GDB扩展.这是大多数BSD系统上DBX使用的格式.-gstabs+以stabs格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.-gcoff以COFF格式(如果支持)输出调试信息.这是在System V第四版以前的大多数System V系统上SDB使用的格式.-gxcoff以XCOFF格式(如果支持)输出调试信息.这是IBM RS/6000系统上DBX调试器使用的格式.-gxcoff+以XCOFF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.-gdwarf以DWARF格式(如果支持)输出调试信息.这是大多数System V第四版系统上SDB使用的格式.-gdwarf+以DWARF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.-glevel-ggdblevel-gstabslevel-gcofflevel -gxcofflevel-gdwarflevel请求生成调试信息,同时用level指出需要多少信息.默认的level值是2.Level 1输出最少量的信息,仅够在不打算调试的程序段内backtrace.包括函数和外部变量的描述,但是没有局部变量和行号信息.Level 3包含更多的信息,如程序中出现的所有宏定义.当使用`-g3'选项的时候,某些调试器支持宏扩展.-p产生额外代码,用于输出profile信息,供分析程序prof使用.-pg产生额外代码,用于输出profile信息,供分析程序gprof使用.-a产生额外代码,用于输出基本块(basic block)的profile信息,它记录各个基本块的执行次数,供诸如 tcov此类的程序分析.但是注意,这个数据格式并非tcov期待的.最终GNU gprof 将处理这些数据.-ax产生额外代码,用于从'bb.in'文件读取基本块的profile参数,把profile的结果写到'bb.out' 文件. `bb.in'包含一张函数列表.一旦进入列表中的某个函数, profile操作就开始,离开最外层的函数后, profile操作就结束.以`-'为前缀名的函数排除在profile操作之外.如果函数名不是唯一的,它可以写成`/path/filename.d:functionname'来澄清. `bb.out'将列出一些有效的文件名.这四个函数名具有特殊含义:`__bb_jumps__'导致跳转(jump)频率写进`bb.out'. `__bb_trace__'导致基本块序列通过管道传到`gzip',输出`bbtrace.gz'文件. `__bb_hidecall__'导致从跟踪(trace)中排除call 指令. `__bb_showret__'导致在跟踪中包括返回指令.-dletters编译的时候,在letters指定的时刻做调试转储(dump).用于调试编译器.大多数转储的文件名通过源文件名添加字词获得(例如`foo.c.rtl'或`foo.c.jump').-dM预处理结束的时候转储所有的宏定义,不输出到文件.-dN预处理结束的时候转储所有的宏名.-dD预处理结束的时候转储所有的宏定义,同时进行正常输出.-dy语法分析(parse)的时候在标准错误转储调试信息.-drRTL阶段后转储到`file.rtl'.-dx仅对函数生成RTL,而不是编译.通常和`r'联用.-dj第一次跳转优化后转储到`file.jump'.-dsCSE (包括有时候跟在CSE后面的跳转优化)后转储到`file.cse'.-dL循环优化后转储到`file.loop'.-dt第二次CSE处理(包括有时候跟在CSE后面的跳转优化)后转储到`file.cse2'.-df流程分析(flow analysis)后转储到`file.flow'.-dc指令组合(instruction combination)后转储到`bine'.-dS第一次指令安排(instruction schedule)后转储到`file.sched'.-dl局部寄存器分配后转储到`file.lreg'.-dg全局寄存器分配后转储到`file.greg'.-dR第二次指令安排(instruction schedule)后转储到`file.sched2'.-dJ最后一次跳转优化后转储到`file.jump2'.-dd推迟分支调度(delayed branch scheduling)后转储到`file.dbr'.-dk寄存器-堆栈转换后转储到`file.stack'.-da产生以上所有的转储.-dm运行结束后,在标准错误显示内存使用统计.-dp在汇编输出加注指明使用了哪些模式(pattern)及其替代模式.-fpretend-float交叉编译的时候,假定目标机和宿主机使用同样的浮点格式.它导致输出错误的浮点常数,但是在目标机上运行的时候, 真实的指令序列有可能和GNU CC希望的一样.-save-temps保存那些通常是``临时''的中间文件;置于当前目录下,并且根据源文件命名.因此,用`-c -save-temps'选项编译`foo.c '会生成` foo.cpp'和`foo.s' 以及`foo.o'文件.-print-file-name=library显示库文件library的全路径名,连接时会使用这个库---其他什么事情都不作.根据这个选项, GNU CC既不编译,也不连接,仅仅显示文件名.-print-libgcc-file-name和`-print-file-name=libgcc.a'一样.-print-prog-name=program类似于`-print-file-name',但是查找程序program如`cpp'.优化选项(OPTIMIZATION OPTION)这些选项控制多种优化措施:-O-O1优化.对于大函数,优化编译占用稍微多的时间和相当大的内存.不使用`-O'选项时,编译器的目标是减少编译的开销,使编译结果能够调试.语句是独立的:如果在两条语句之间用断点中止程序,你可以对任何变量重新赋值,或者在函数体内把程序计数器指到其他语句,以及从源程序中精确地获取你期待的结果.不使用`-O'选项时,只有声明了register的变量才分配使用寄存器.编译结果比不用 `-O'选项的PCC要略逊一筹.使用了`-O'选项,编译器会试图减少目标码的大小和执行时间.如果指定了`-O'选项, `-fthread-jumps'和`-fdefer-pop'选项将被打开.在有delay slot的机器上, `-fdelayed-branch'选项将被打开.在即使没有帧指针 (frame pointer)也支持调试的机器上, `-fomit-frame-pointer'选项将被打开.某些机器上还可能会打开其他选项.-O2多优化一些.除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作.例如不进行循环展开(loop unrolling)和函数内嵌(inlining).和-O选项比较,这个选项既增加了编译时间,也提高了生成代码的运行效果.-O3优化的更多.除了打开-O2所做的一切,它还打开了-finline-functions选项.-O0不优化.如果指定了多个-O选项,不管带不带数字,最后一个选项才是生效的选项.诸如`-fflag'此类的选项描述一些机器无关的开关.大多数开关具有肯定和否定两种格式; `-ffoo'开关选项的否定格式应该是`-fno-foo'.下面的列表只展示了一种格式---那个不是默认选项的格式.你可以通过去掉或添加`no-'构造出另一种格式.-ffloat-store不要在寄存器中存放浮点变量.这样可以防止某些机器上不希望的过高精度,如68000的浮点寄存器(来自68881)保存的精度超过了double应该具有的精度.对于大多数程序,过高精度只有好处.但是有些程序严格依赖于IEEE浮点数的定义.对这样的程序可以使用 `-ffloat-store'选项.-fmemoize-lookups-fsave-memoized使用探索法(heuristic)进行更快的编译(仅对C++).默认情况下不使用探索法.由于探索法只对某些输入文件有效,其他程序的编译速度会变得更慢.第一次编译器必须对成员函数(或对成员数据的引用)建立一个调用.它必须(1)判断出这个类是否实现了那个名字的成员函数; (2)决定调用哪个成员函数(涉及到推测需要做哪种类型转换); (3)检查成员函数对调用者是否可见.所有这些构成更慢的编译.一般情形,第二次对成员函数(或对成员数据的引用)建立的调用,必须再次经过相同长度的处理.这意味着象这样的代码cout << "This " << p << " has " << n << " legs.\n";对整个三步骤要做六次遍历.通过使用软件缓存, ``命中''能够显著地减少这种代价.然而不幸的是,使用这种缓存必须实现其他机制,带来了它自己的开销. `-fmemoize-lookups'选项打开软件缓存.因为函数的正文环境不同,函数对成员和成员函数的访问权(可见性)也可能不同, g++可能需要刷新缓存. 使用`-fmemoize-lookups'选项,每编译完一个函数就刷新缓存.而`-fsave-memoized'选项也启用同样的缓存,但是当编译器发觉最后编译的函数的正文环境产生的访问权和下一个待编译的函数相同,编译器就保留缓存内容.这对某个类定义许多成员函数时非常有用:除了某些其他类的友函数,每个成员函数拥有和其他成员函数完全一样的访问权,因而无需刷新缓存.-fno-default-inline默认为不要把成员函数内嵌,因为它们定义在类的作用域内(仅C++).-fno-defer-pop一旦函数返回,参数就立即弹出.对于那些调用函数后必须弹出参数的机器,编译器一般情况下让几次函数调用的参数堆积在栈上,然后一次全部弹出.-fforce-mem做数学运算前把将要使用的内存操作数送入寄存器.通过把内存访问转换成潜在的公共子表达式,它可能产生较好的目标码. 如果它们不是公共子表达式,指令组合应该消除各自的寄存器载荷.我乐意倾听不同意见.-fforce-addr做数学运算前把将要使用的内存地址常数送入寄存器.它可能和`-fforce-mem'一样产生较好的目标码.我乐意倾听不同意见.-fomit-frame-pointer对于不需要帧指针(frame pointer)的函数,不要在寄存器中保存帧指针.这样能够避免保存,设置和恢复帧指针的指令;同时对许多函数提供一个额外的寄存器. 但是在大多数机器上将无法调试.某些机器上,如Vax,这个选项无效,因为标准调用序列自动处理帧指针,通过假装不存在而不保存任何东西.机器描述宏 FRAME_POINTER_REQUIRED控制目标机是否支持这个选项.-finline-functions把所有简单的函数集成进调用者.编译器探索式地决定哪些函数足够简单,值得这种集成.如果集成了所有给定函数的调用,而且函数声明为static,那么一般说来GCC有权不按汇编代码输出函数.-fcaller-saves允许在寄存器里分配数值,但是这个方案通常受到各个函数调用的冲击,因此GCC生成额外的代码,在函数调用的前后保存和复原寄存器内容.仅当生成代码看上去优于反之结果时才实现这样的分配.某些机器上该选项默认为允许,通常这些机器没有调用保护寄存器代替使用.-fkeep-inline-functions即使集成了某个函数的所有调用,而且该函数声明为static,仍然输出这个函数一个独立的,运行时可调用的版本.-fno-function-cse不要把函数地址存入寄存器;让调用固定函数的指令显式给出函数地址.这个选项产生效率较低的目标码,但是如果不用这个选项,某些不寻常的hack,改变汇编器的输出,可能因优化而带来困惑.-fno-peephole禁止任何机器相关的peephole优化.-ffast-math这个选项出于速度优化,允许GCC违反某些ANSI或IEEE规则/规格.例如,它允许编译器假设sqrt 函数的参数是非负数.这个选项不被任何`-O'选项打开,因为对于严格依靠IEEE或ANSI规则/规格实现的数学函数,程序可能会产生错误的结果.下列选项控制特定的优化. `-O2'选项打开下面的大多数优化项,除了`-funroll-loops'和 `-funroll-all-loops'项.而`-O'选项通常打开`-fthread-jumps'和`-fdelayed-branch' 优化项,但是特定的机器上的默认优化项有可能改变.如果特别情况下非常需要``微调''优化,你可以使用下面的选项.-fstrength-reduce执行循环强度缩小(loop strength reduction)优化,并且消除重复变量.-fthread-jumps执行优化的地点是,如果某个跳转分支的目的地存在另一个条件比较,而且该条件比较包含在前一个比较语句之内,那么执行优化.根据条件是true或者false,前面那条分支重定向到第二条分支的目的地或者紧跟在第二条分支后面.-funroll-loops执行循环展开(loop unrolling)优化.仅对循环次数能够在编译时或运行时确定的循环实行.-funroll-all-loops执行循环展开(loop unrolling)优化.对所有循环实行.通常使程序运行的更慢.-fcse-follow-jumps在公共子表达式消元(common subexpression elimination)的时候,如果没有其他路径到达某个跳转的目的地,就扫过这条jump指令.例如,如果CSE遇到带有else从句的if语句,当条件测试为 false时, CSE就跟在jump后面.-fcse-skip-blocks它类似于`-fcse-follow-jumps'选项,但是CSE跟在条件跳转后面,条件跳转跳过了语句块(block).如果CSE 遇到一条简单的if语句,不带else从句, `-fcse-skip-blocks'选项将导致CSE跟在if产生的跳转后面.-frerun-cse-after-loop执行循环优化后,重新进行公共子表达式消元.-felide-constructors如果看上去合理就省略构造子(仅C++).根据这个选项,对于下面的代码, GNU C++直接从调用foo 初始化y,而无需通过临时变量:A foo (); A y = foo ();如果没有这个选项, GNU C++首先通过调用类型A 合适的构造子初始化y;然后把 foo的结果赋给临时变量;最后,用临时变量替换`y'的初始值.ANSI C++标准草案规定了默认行为(`-fno-elide-constructors').如果程序的构造子存在副效应, `-felide-constructors'选项能够使程序有不同的表现,因为可能忽略一些构造子的调用.-fexpensive-optimizations执行一些相对开销较大的次要优化.-fdelayed-branch如果对目标机支持这个功能,它试图重新排列指令,以便利用延迟分支(delayed branch)指令后面的指令空隙.-fschedule-insns如果对目标机支持这个功能,它试图重新排列指令,以便消除因数据未绪造成的执行停顿.这可以帮助浮点运算或内存访问较慢的机器调取指令,允许其他指令先执行,直到调取指令或浮点运算完成.-fschedule-insns2类似于`-fschedule-insns'选项,但是在寄存器分配完成后,需要一个额外的指令调度过程.对于寄存器数目相对较少,而且取内存指令大于一个周期的机器,这个选项特别有用.目标机选项(TARGET OPTION)缺省情况下, GNU CC编译出本机类型的目标码.然而也可以把他安装成交叉编译器, 为其他机型编译程序.事实上,针对不同的目标机,可以同时安装GNU CC相应的配置.然后用`-b'选项指定目标机种.顺便提一下,新版本和旧版本的GNU CC可以共存.其中一个版本(可能是最新的那个)为缺省版本,但是有时候你希望使用其他版本.-b machine参数machine指出编译的目标机种.这个选项用于安装为交叉编译器的GNU CC.参数machine的值和配置GNU CC交叉编译器时设置的机器类型一样.例如,如果交叉编译器配置有`configure i386v',意思是编译80386上的System V目标码,那么你可以通过`-b i386v'运行交叉编译器.如果没有指定`-b'选项,通常指编译本机目标码.-V version参数version指出运行哪个版本的GNU CC.这个选项用于安装了多个版本的GCC.例如,如果 version是`2.0',意味着运行GNU CC 2.0版.如果没有指定`-V'选项,缺省版本取决于GNU CC的安装方式,一般说来推荐使用通用版本.机器相关选项(MACHINE DEPENDENT OPTION)每一种目标机型都有自己的特别选项,这些选项用`-m '开关引导,选择不同的硬件型号或配置---例如, 68010还是68020,有没有浮点协处理器.通过指定选项,安装编译器的一个版本能够为所有的型号或配置进行编译.此外,编译器的某些配置支持附加的特殊选项,通常是为了在命令行上兼容这个平台的其他编译器.下面是针对68000系列定义的`-m'选项:-m68000-mc68000输出68000的目标码.如果编译器按基于68000的系统配置,这个选项就是缺省选项.-m68020-mc68020输出68020的目标码(而不是68000).如果编译器按基于68020的系统配置,这个选项就是缺省选项.-m68881输出包含68881浮点指令的目标码.对于大多数基于68020的系统这是缺省选项,除非设置编译器时指定了 -nfp .-m68030输出68030的目标码.如果编译器按基于68030的系统配置,这个选项就是缺省选项.-m68040输出68040的目标码.如果编译器按基于68040的系统配置,这个选项就是缺省选项.-m68020-40输出68040的目标码,但是不使用新指令.生成的代码可以在68020/68881上,也可以在68030或 68040上较有效地运行.-mfpa输出包含SUN FPA浮点指令的目标码.-msoft-float输出包含浮点库调用的目标码. 警告:所需的库不是GNU CC的组成部分.一般说来GCC使用该机型本地C 编译器的相应部件,但是作交叉编译时却不能直接使用.你必须自己管理提供合适的函数库用于交叉编译.-mshort认为int类型是16位宽,相当于short int.-mnobitfield不使用位域(bit-field)指令. `-m68000'隐含指定了`-mnobitfield'.-mbitfield使用位域指令. `-m68020'隐含指定了`-mbitfield'.如果你使用未改装的gcc,这就是默认选项.-mrtd采用另一种函数调用约定,函数接受固定数目的参数,用rtd指令返回,该指令返回时弹出栈内的参数.这个方法能够使调用者节省一条指令,因为他这里不需要弹出参数.这种调用约定不兼容UNIX的正常调用.因此如果你需要调用UNIX编译器编译的库函数,你就不能使用这个选项.此外,所有参数数量可变地函数必须提供函数原型(包括printf);否则编译器会生成错误的调用代码.另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码. (正常情况下,多余的参数被安全无害的忽略.)68010和68020处理器支持rtd指令,但是68000不支持.下面是针对VAX定义的`-m'选项:-munix禁止输出某些跳转指令(aobleq等等), VAX的UNIX汇编器无法跨越长范围(long ranges) 进行处理.-mgnu如果使用GNU汇编器,则输出那些跳转指令,-mg输出g-format浮点数,取代d-format.下面是SPARC支持的`-m'选项开关:-mfpu-mhard-float输出包含浮点指令的目标码.这是缺省选项.-mno-fpu-msoft-float输出包含浮点库调用的目标码. 警告:没有为SPARC提供GNU浮点库.一般说来使用该机型本地C编译器的相应部件,但是不能直接用于交叉编译.你必须自己安排,提供用于交叉编译的库函数.-msoft-float改变了输出文件中的调用约定;因此只有用这个选项编译整个程序才有意义.-mno-epilogue-mepilogue使用-mepilogue (缺省)选项时,编译器总是把函数的退出代码放在函数的尾部.任何在函数中间的退出语句(例如C中的return语句)将产生出跳转指令指向函数尾部.使用-mno-epilogue选项时,编译器尽量在每个函数退出点嵌入退出代码.-mno-v8-mv8-msparclite这三个选项选择不同种类的SPARC系统.默认情况下(除非特别为Fujitsu SPARClite配置), GCC生成SPARC v7目标码.-mv8生成SPARC v8目标码.他和v7目标码唯一的区别是,编译器生成整数乘法和整数除法指令, SPARC v8支持该指令,而v7体系不支持.-msparclite生成SPARClite目标码.增加了SPARClite支持的整数乘法,整数除法单步扫描 (integer divide step and scan (ffs))指令. v7体系不支持这些指令.-mcypress-msupersparc这两个选项选择处理器型号,针对处理器进行代码优化.-mcypress选项(默认项)使编译器对Cypress CY7C602芯片优化代码, SparcStation/SparcServer 3xx系列使用这种芯片.该选项也适用于老式的SparcStation 1, 2, IPX 等机型..-msupersparc选项使编译器对SuperSparc处理器优化代码, SparcStation 10, 1000 和2000系列使用这种芯片.同时该选项启用完整的SPARC v8指令集.下面是针对Convex定义的`-m'选项:-mc1输出C1的目标码.当编译器对C1配置时,这是默认选项.-mc2输出C2的目标码.当编译器对C2配置时,这是默认选项.-margcount。
Redhat linux上安装 gcc编译器
在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种:1)一种是软件的源代码,您需要自己动手编译它。
这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。
2)另一种是软件的可执行程序,你只要安装它就可以了。
这种软件安装包通常被是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是.rpm。
当然,也有用rpm格式打包的源代码,用gzip压缩过的可执行程序包。
只要您理解了以下的思路,这两种形式的安装包也不在话下了。
下面,我们就分成两个部分来说明软件安装思路:第一部分:搞定.tar.gz1.首先,使用tar -xzvf来解开这个包,如:#tar -xzvf apache_1_3_6_tar.gz这样就会在当前目录中创建了一个新目录(目录名与.tat.gz包的文件名类似),用来存放解压了的内容。
如本例中就是apache_1.3.62.进入这个目录,再用ls命令查看一下所包含的文件,如:#cd apache_1.3.6#ls你观察一下这个目录中包含了以下哪一个文件:configure、Makefile还是Imake。
1)如果是configure文件,就执行:#./configure#make#make install2)如果是Makefile文件,就执行:#make#make install3)如果是Imake文件,就执行:#xmkmf#make#make install3.如果没有出现什么错误提示的话,就搞定了。
至于软件安装到什么地方,通常会在安装时出现。
否则就只能查阅一下README,或者问问我,:-)如果遇到错误提示,也别急,通常是十分简单的问题:1)没有安装C或C++编译器;确诊方法:执行命令gcc(C++则为g++),提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:#rpm -ivh gcc* (哈哈,我们用到了第二种安装方式)2)没有安装make工具;确诊方法:执行命令make,提示找不到这个命令。
中文gcc手册
中文gcc手册GCC(GNU Compiler Collection)是一套用于编译各种编程语言的开源编译器。
它最初由Richard Stallman创建并由GNU项目维护,成为了GNU计划的重要组成部分。
GCC支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等。
它不仅可以在各种操作系统上使用,如Linux、Windows和macOS等,还可以为不同架构的处理器生成可执行文件。
例如,x86、ARM和PowerPC等。
GCC提供了广泛的优化选项,以生成高效的代码。
GCC手册提供了关于GCC的详细信息,包括GCC的安装、使用和配置等方面的内容。
一般而言,GCC手册主要包括以下几个部分:1.安装GCC:包括从官方网站下载GCC源代码、配置和编译GCC、安装GCC及其依赖项等步骤。
2. GCC命令行选项:介绍GCC的各种命令行选项,用于指定编译器行为、选择编译器版本、指定目标架构和调整编译器优化等。
3. C语言扩展:介绍GCC对C语言的扩展功能,如内置函数、语言特性和编译指令等。
4. C++语言扩展:介绍GCC对C++语言的扩展功能,如模板元编程、重载、命名空间和异常处理等。
5.编译器优化:介绍GCC的优化选项,包括代码优化原则、优化等级、循环优化、内敛和代码生成等。
6. GCC插件:介绍GCC插件的开发和使用,包括GCC插件架构、插件开发接口和实现自定义的编译器扩展等。
7. GCC内部结构:介绍GCC的内部结构和设计原理,包括前端、中间表示(IR)、优化器和后端等。
GCC手册可以帮助开发人员更好地理解和使用GCC编译器。
它提供了丰富的示例代码和实用技巧,有助于编写高效和可靠的代码。
在GCC 手册中,用户可以找到关于GCC的详细说明、使用示例和案例研究等,可用作学习GCC编译器的重要参考资料。
总之,GCC手册是一本详尽而全面的文档,为用户提供了GCC编译器的深入指导和使用示例。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例子用法 gcc -o hello.exe hello.c (哦,windows 用习惯了) gcc -o hello.asm -S hello.c -pipe 使用管道代替编译中临时文件,在使用非 gnu 汇编工具的时候,可能有些问题 gcc -pipe -o hello.exe hello.c -ansi 关闭 gnu c 中与 ansi c 不兼容的特性,激活 ansi c 的专有特性(包括禁止一些 asm inline typeof 关键字,以及 UNIX,vax 等预处理宏, -fno-asm 此选项实现 ansi 选项的功能的一部分,它禁止将 asm,inline 和 typeof 用作关键字。 -fno-strict-prototype 只对 g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数 和类型说明,而不是没有参数. 而 gcc 无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型 -fthis-is-varialble 就是向传统 c++看齐,可以使用 this 当一般变量使用. -fcond-mismatch 允许条件表达式的第二和第三参数类型不匹配,表达式的值将为 void 类型 -funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char 这四个参数是对 char 类型进行设置,决定将 char 类型设置成 unsigned char(前两个参数)或者 signed char(后两个参数) -include file 包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就 相当于在代码中使用#include<filename> 例子用法: gcc hello.c -include /root/pianopan.h -imacros file 将 file 文件的宏,扩展到 gcc/g++的输入文件,宏定义本身并不出现在输入文件中 -Dmacro 相当于 C 语言中的#define macro
和-M 相同,但是输出将导入到.d 的文件里面 -MMD 和-MM 相同,但是输出将导入到.d 的文件里面 -Wa,option 此选项传递 option 给汇编程序;如果 option 中间有逗号,就将 option 分成多个选项,然后传递 给会汇编程序 -Wl,option 此选项传递 option 给连接程序;如果 option 中间有逗号,就将 option 分成多个选项,然后传递 给会连接程序.
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库. -traditional 试图让编译器支持传统的 C 语言特性 gcc 命令的常用选项 选项 解释 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 -c 只编译并生成目标文件。 -DMACRO 以字符串“1”定义 MACRO 宏。 -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 -E 只运行 C 预编译器。 -g 生成调试信息。GNU 调试器可利用该信息。 -IDIRECTORY 指定额外的头文件搜索路径 DIRECTORY。 -LDIRECTORY 指定额外的函数库搜索路径 DIRECTORY。 -lLIBRARY 连接时搜索指定的函数库 LIBRARY。 -m486 针对 486 进行代码优化。 -o FILE 生成指定的输出文件。用在生成可执行文件时。 -O0 不进行优化处理。 -O 或 -O1 优化生成代码。 -O2 进一步优化。 -O3 比 -O2 更进一步优化,包括 inline 函数。 -shared 生成共享目标文件。通常用在建立共享库时。 -static 禁止使用共享连接。 -UMACRO 取消对 MACRO 宏的定义。 -w 不生成任何警告信息。 -Wall 生成所有警告信息。
-llibrary 制定编译的时候使用的库 例子用法 gcc -lcurses hello.c 使用 ncurses 库编译程序 -Ldir 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然 编译器将只在标准库的目录找。这个 dir 就是目录的名称。 -O0 -O1 -O2 -O3 编译器的优化选项的 4 个级别,-O0 表示没有优化,-O1 为缺省值,-O3 优化级别最高 -g 只是编译器,在编译的时候,产生调试信息。 -gstabs 此选项以 stabs 格式声称调试信息,但是不包括 gdb 调试信息. -gstabs+ 此选项以 stabs 格式声称调试信息,并且包含仅供 gdb 使用的额外调试信息. -ggdb 此选项将尽可能的生成 gdb 的可以使用的调试信息. -static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么 动态连接库,就可以运行.
-Dmacro=defn 相当于 C 语言中的#define macro=defn -Umacro 相当于 C 语言中的#undef macro -undef 取消对任何非标准宏的定义 -Idir 在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到, 他回到缺省的头文件目录找,如果使用-I 制定了目录,他 回先在你所制定的目录查找,然后再按常规的顺序去找. 对于#include<file>,gcc/g++会到-I 制定的目录查找,查找不到,然后将到系统的缺省的头文件目 录查找 -I就是取消前一个参数的功能,所以一般在-Idir 之后使用 -idirafter dir 在-I 的目录里面查找失败,讲到这个目录里面查找. -iprefix prefix -iwithprefix dir 一般一起使用,当-I 的目录查找失败,会到 prefix+dir 下查找 -nostdinc 使编译器不再系统缺省的头文件目录里面找头文件,一般和-I 联合使用,明确限定头文件的位 置 -nostdin C++ 规定不在 g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创 libg++E 使用,有时候分析程序,用这个很方便的 -M 生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用 gcc -M hello.c 来测试一 下,很简单。 -MM 和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。 -MD