gcc编译选项【转】
转自:https://blog.csdn.net/rheostat/article/details/19811407
常用选项
-E
:只进行预处理,不编译-S
:只编译,不汇编-c
:只编译、汇编,不链接-g
:包含调试信息-I
:指定include包含文件的搜索目录-o
:输出成指定文件名
高级选项
-v
:详细输出编译过程中所采用的每一个选项-C
:预处理时保留注释信息-ggdb
:在可执行文件中包含可供GDB
使用的调试信息-fverbose-asm
:在编译成汇编语言时,把C变量的名称作为汇编语言中的注释-save-temps
:自动输出预处理文件、汇编文件、对象文件,编译正常进行-fsyntax-only
:只测试源文件语法是否正确,不会进行任何编译操作-ffreestanding
:编译成独立程序,而非宿主程序
语言标准
-ansi
:ANSI标准-std=c99
:C99标准-std=gnu89
:ISO/IEC 9899:1990 以及GNU扩充-std=gnu99
:ISO/IEC 9899:1999 以及GNU扩充-trigraphs
:支持ISO C三字符组
出错提示
-w
:忽略所有警告-Werror
:不区分警告和错误,遇到任何警告都停止编译-Wall
:开启大部分警告提示-Wshadow
:某语句块作用域变量与更大作用域的另一变量同名时发出警告(此警告未包含在-Wall
选项中,需单独开启)-Wextra
:对所有合法但值得怀疑的表达式发出警告
优化选项
-O0
:关闭所有优化选项-O1
:第一级别优化,使用此选项可使可执行文件更小、运行更快,并不会增加太多编译时间,可以简写为-O
-O2
:第二级别优化,采用了几乎所有的优化技术,使用此选项会延长编译时间-O3
:第三级别优化,在-O2
的基础上增加了产生inline
函数、使用寄存器等优化技术-Os
:此选项类似于-O2
,作用是优化所占用的空间,但不会进行性能优化,常用于生成最终版本
自定义扩展名
-x
:使用此选项可以指定自定义的源文件扩展名,类型有c
、c-header
、cpp-output
、assembler
、assembler-with-cpp
、none
凡-x
后面所列的所有文件都会被视为其指定的类型,要想改变类型可以再一次使用-x
选项,或者使用-x none
回到默认设置
示例:gcc -o test test.c -x assembler test.asm -x c test2.c
静态库的创建和使用
以创建静态库static_lib.a
为例
- 编写C源文件
static_lib.c
,其中写入需要重复调用的函数,然后使用命令gcc -c static_lib.c
生成目标文件static_lib.o
- 使用
ar
工具创建静态库,命令格式:ar rcs static_lib.a static_lib.o
- 编写C头文件
static_lib.h
,其中写入这些函数的原型声明 - 编写主函数
app.c
,引入头文件static_lib.h
,这样就可以正常使用那些自定义的可复用函数了 - 使用命令
gcc app.c -static ./static_lib.a -o app
编译生成可执行文件app
动态库的创建和使用
以创建动态库share_lib.so
为例
- 编写C源文件
share_lib.c
,写入需要重复调用的函数,然后使用命令gcc -shared -fPIC -o share_lib.so share_lib.c
生成动态库文件share_lib.so
- 编写C头文件
share_lib.h
,写入函数的原型声明 - 编写主函数
app.c
,引入头文件share_lib.h
,然后就可以调用在动态库中自定义的函数了 - 使用命令
gcc app.c ./share_lib.so -o app
编译生成可执行文件app
-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat
-Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration
-Wcomment -Wformat -Wmain (only for C/ObjC and unless
-ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses
-Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point
-Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1
-Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)
-Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value
-Wunused-variable
unused-function:警告声明但是没有定义的static函数;
unused- label:声明但是未使用的标签;
unused-parameter:警告未使用的函数参数;
unused-variable:声明但是未使用的本地变量;
unused-value:计算了但是未使用的值;
format:printf和scanf这样的函数中的格式字符串的使用不当;
implicit-int:未指定类型;
implicit-function:函数在声明前使用;
char- subscripts:使用char类作为数组下标(因为char可能是有符号数);
missingbraces:大括号不匹配;
parentheses: 圆括号不匹配;
return-type:函数有无返回值以及返回值类型不匹配;
sequence-point:违反顺序点的代码,比如 a[i] = c[i++];
switch:switch语句缺少default或者switch使用枚举变量为索引时缺少某个变量的case;
strict- aliasing=n:使用n设置对指针变量指向的对象类型产生警告的限制程度,默认n=3;只有在-fstrict-aliasing设置的情况下有效;
unknow-pragmas:使用未知的#pragma指令;
uninitialized:使用的变量为初始化,只在-O2时有效;
以下是在-Wall中不会激活的警告选项:
cast-align:当指针进行类型转换后有内存对齐要求更严格时发出警告;
sign- compare:当使用signed和unsigned类型比较时;
missing-prototypes:当函数在使用前没有函数原型时;
packed:packed 是gcc的一个扩展,是使结构体各成员之间不留内存对齐所需的空间,有时候会造成内存对齐的问题;
padded:也是gcc的扩展,使结构体成员之间进行内存对齐的填充,会造成结构体体积增大.
unreachable-code:有不会执行的代码时.
inline:当inline函数不再保持inline时 (比如对inline函数取地址);
disable-optimization:当不能执行指定的优化时.(需要太多时间或系统资源).
可以使用 -Werror时所有的警告都变成错误,使出现警告时也停止编译.需要和指定警告的参数一起使用.
优化:
gcc默认提供了5级优化选项的集合:
-O0:无优化(默认)
-O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用.
-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性能.
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.
-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项.
-O1包含的选项-O1通常可以安全的和调试的选项一起使用:
-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch
-fdse -fguess-branch-probability -fif-conversion2 -fif-conversion
-finline-small-functions -fipa-pure-const -fipa-reference
-fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch
-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse
-ftree-fre -ftree-sra -ftree-ter -funit-at-a-time
以下所有的优化选项需要在名字前加上-f,如果不需要此选项可以使用-fno-前缀
defer-pop:延迟到只在必要时从函数参数栈中pop参数;
thread- jumps:使用跳转线程优化,避免跳转到另一个跳转;
branch-probabilities:分支优化;
cprop- registers:使用寄存器之间copy-propagation传值;
guess-branch-probability:分支预测;
omit- frame-pointer:可能的情况下不产生栈帧;
-O2:以下是-O2在-O1基础上增加的优化选项:
-falign-functions -falign-jumps -falign-loops -falign-labels
-fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks -fexpensive-optimizations -fgcse
-fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove
-freorder-blocks -freorder-functions -frerun-cse-after-loop
-fsched-interblock -fsched-spec -fschedule-insns
-fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre
-ftree-vrp
cpu架构的优化选项,通常是-mcpu(将被取消);-march,-mtune
Debug选项:
在 gcc编译源代码时指定-g选项可以产生带有调试信息的目标代码,gcc可以为多个不同平台上帝不同调试器提供调试信息,默认gcc产生的调试信息是为 gdb使用的,可以使用-gformat 指定要生成的调试信息的格式以提供给其他平台的其他调试器使用.常用的格式有
-ggdb:生成gdb专用的调试信息,使用最适合的格式(DWARF 2,stabs等)会有一些gdb专用的扩展,可能造成其他调试器无法运行.
-gstabs:使用 stabs格式,不包含gdb扩展,stabs常用于BSD系统的DBX调试器.
-gcoff:产生COFF格式的调试信息,常用于System V下的SDB调试器;
-gxcoff:产生XCOFF格式的调试信息,用于IBM的RS/6000下的DBX调试器;
-gdwarf- 2:产生DWARF version2 的格式的调试信息,常用于IRIXX6上的DBX调试器.GCC会使用DWARF version3的一些特性.
可以指定调试信息的等级:在指定的调试格式后面加上等级:
如: -ggdb2 等,0代表不产生调试信息.在使用-gdwarf-2时因为最早的格式为-gdwarf2会造成混乱,所以要额外使用一个-glevel来指定调试信息的等级,其他格式选项也可以另外指定等级.
gcc可以使用-p选项指定生成信息以供porf使用.
GCC常用选项
选项 | 含义 |
---|---|
--help --target-help |
显示 gcc 帮助说明。‘target-help’是显示目标机器特定的命令行选项。 |
--version | 显示 gcc 版本号和版权信息 。 |
-o outfile | 输出到指定的文件。 |
-x language | 指明使用的编程语言。允许的语言包括:c c++ assembler none 。 ‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言。 |
-v | 打印较多信息,显示编译器调用的程序。 |
-### | 与 -v 类似,但选项被引号括住,并且不执行命令。 |
-E | 仅作预处理,不进行编译、汇编和链接。如上图所示。 |
-S | 仅编译到汇编语言,不进行汇编和链接。如上图所示。 |
-c | 编译、汇编到目标代码,不进行链接。如上图所示。 |
-pipe | 使用管道代替临时文件。 |
-combine | 将多个源文件一次性传递给汇编器。 |
3 其他GCC选项
更多有用的GCC选项:
命令 | 描述 |
---|---|
-l library -llibrary |
进行链接时搜索名为library的库。 例子: $ gcc test.c -lm -o test |
-Idir | 把dir加入到搜索头文件的路径列表中。 例子: $ gcc test.c -I../inc -o test |
-Ldir | 把dir加入到搜索库文件的路径列表中。 例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test |
-Dname | 预定义一个名为name的宏,值为1。 例子: $ gcc -DTEST_CONFIG test.c -o test |
-Dname=definition | 预定义名为name,值为definition的宏。 |
-ggdb -ggdblevel |
为调试器 gdb 生成调试信息。level可以为1,2,3,默认值为2。 |
-g -glevel |
生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level取值同上。 |
-s | 去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。 |
-M | 告 诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件。生成的规则可以是单行,但如果太长,就用`/'-换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序。 |
-C | 告诉预处理器不要丢弃注释。配合`-E'选项使用。 |
-P | 告诉预处理器不要产生`#line'命令。配合`-E'选项使用。 |
-static | 在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上无效。 |
-nostdlib | 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。 |
Warnings | |
-Wall | 会打开一些很有用的警告选项,建议编译时加此选项。 |
-W -Wextra |
打印一些额外的警告信息。 |
-w | 禁止显示所有警告信息。 |
-Wshadow | 当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。 |
-Wpointer-arith | 对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。 |
-Wcast-qual | 当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。 |
-Waggregate-return | 如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。 |
-Winline | 无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。 |
-Werror | 把警告当作错误。出现任何警告就放弃编译。 |
-Wunreachable-code | 如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。 |
-Wcast-align | 一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。 |
-Wundef | 当一个没有定义的符号出现在 #if 中时,给出警告。 |
-Wredundant-decls | 如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别。 |
Optimization | |
-O0 | 禁止编译器进行优化。默认为此项。 |
-O -O1 |
尝试优化编译时间和可执行文件大小。 |
-O2 | 更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。 |
-O3 | 在 -O2 的基础上再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。 |
-Os | 对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。 |
-finline-functions | 把所有简单的函数内联进调用者。编译器会探索式地决定哪些函数足够简单,值得做这种内联。 |
-fstrict-aliasing | 施加最强的别名规则(aliasing rules)。 |
Standard | |
-ansi | 支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。 |
-std=c89 -iso9899:1990 |
指明使用标准 ISO C90 作为标准来编译程序。 |
-std=c99 -std=iso9899:1999 |
指明使用标准 ISO C99 作为标准来编译程序。 |
-std=c++98 | 指明使用标准 C++98 作为标准来编译程序。 |
-std=gnu9x -std=gnu99 |
使用 ISO C99 再加上 GNU 的一些扩展。 |
-fno-asm | 不把asm, inline或typeof当作关键字,因此这些词可以用做标识符。用 __asm__, __inline__和__typeof__能够替代它们。 `-ansi' 隐含声明了`-fno-asm'。 |
-fgnu89-inline | 告诉编译器在 C99 模式下看到 inline 函数时使用传统的 GNU 句法。 |
C options | |
-fsigned-char -funsigned-char |
把char定义为有/无符号类型,如同signed char/unsigned char。 |
-traditional | 尝试支持传统C编译器的某些方面。详见GNU C手册。 |
-fno-builtin -fno-builtin-function |
不接受没有 __builtin_ 前缀的函数作为内建函数。 |
-trigraphs | 支持ANSI C的三联符( trigraphs)。`-ansi'选项隐含声明了此选项。 |
-fsigned-bitfields -funsigned-bitfields |
如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域或无符号位域。缺省情况下,位域是有符号的,因为它们继承的基本整数类型,如int,是有符号数。 |
-Wstrict-prototypes | 如果函数的声明或定义没有指出参数类型,编译器就发出警告。很有用的警告。 |
-Wmissing-prototypes | 如果没有预先声明就定义了全局函数,编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这个选项 的目的是检查没有在头文件中声明的全局函数。 |
-Wnested-externs | 如果某extern声明出现在函数内部,编译器就发出警告。 |
C++ options | |
-ffor-scope | 从头开始执行程序,也允许进行重定向。 |
-fno-rtti | 关闭对 dynamic_cast 和 typeid 的支持。如果你不需要这些功能,关闭它会节省一些空间。 |
-Wctor-dtor-privacy | 当一个类没有用时给出警告。因为构造函数和析构函数会被当作私有的。 |
-Wnon-virtual-dtor | 当一个类有多态性,而又没有虚析构函数时,发出警告。-Wall会开启这个选项。 |
-Wreorder | 如果代码中的成员变量的初始化顺序和它们实际执行时初始化顺序不一致,给出警告。 |
-Wno-deprecated | 使用过时的特性时不要给出警告。 |
-Woverloaded-virtual | 如果函数的声明隐藏住了基类的虚函数,就给出警告。 |
Machine Dependent Options (Intel) | |
-mtune=cpu-type | 为指定类型的 CPU 生成代码。cpu-type可以是:i386,i486,i586,pentium,i686,pentium4 等等。 |
-msse -msse2 -mmmx -mno-sse -mno-sse2 -mno-mmx |
使用或者不使用MMX,SSE,SSE2指令。 |
-m32 -m64 |
生成32位/64位机器上的代码。 |
-mpush-args -mno-push-args |
(不)使用 push 指令来进行存储参数。默认是使用。 |
-mregparm=num | 当传递整数参数时,控制所使用寄存器的个数。 |
另外:
当静态库和动态库同名时, gcc命令将优先使用动态库。
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
l -L.:表示要连接的库在当前目录中
l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
l 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。调用动态库的时候 有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
gcc编译选项【转】的更多相关文章
- 2015-08-26: GCC编译选项(转载)
gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告: -Waddress -Warray-bounds (only with -O2) ...
- GCC编译选项
一.看例子分析gcc 的编译选项 gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld 1.-I /home/h ...
- GCC 编译选项
http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html GCC 编译选项(转) gcc提供了大量的警告选项,对代码中可能存在的 ...
- 用于阻止缓冲区溢出攻击的 Linux 内核参数与 gcc 编译选项
先来看看基于 Red Hat 与 Fedora 衍生版(例如 CentOS)系统用于阻止栈溢出攻击的内核参数,主要包含两项: kernel.exec-shield 可执行栈保护,字面含义比较“绕”, ...
- gcc编译选项汇集
gcc -g 调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: -g 以操作系统的本地格式(stabs, COFF, XCOFF,或 ...
- (转载)gcc编译选项总结
转载自:https://blog.csdn.net/gatieme/article/details/21389603 常用编译选项 gcc and g++分别是gnu的c & c++编译器 g ...
- [小技巧] gcc 编译选项-###
原文译至:http://elinux.org/GCC_Tips 的一小部分. -###编译选项用于查看编译的过程 gcc -### <你的命令行的其他部分放在这里> 你运行的GCC其是一系 ...
- GCC 编译选项(转)
转:http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html gcc提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常 ...
- c c++ 函数入口和出口的hook(gcc 编译选项),然后打印出函数调用关系的方法
GCC Function instrumentation机制可以用来跟踪函数的调用关系,在gcc中对应的选项为“-finstrument-functions”.可查看gcc的man page来获取更详 ...
- gcc编译选项的循环重复查找依赖库等命令
link时,若liba.a依赖libb.a,若这样写 -lb -la,则链接通不过,gcc有个选项:-Xlinker ,可以让gcc在链接时反复查找依赖库,用法 : gcc -shared -o li ...
随机推荐
- BZOJ3158 千钧一发(最小割)
可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...
- VS开发环境美化
1.字体,推荐Deja Vu Sans Mono 2.背景色为护眼绿色, 工具-->选项-->环境,字体和颜色,字体改为Deja Vu Sans Mono,项背景 改为
- 【UOJ228】基础数据结构练习题(线段树)
[UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...
- USACO Section 1.5 Superprime Rib 解题报告
题目 题目描述 超级素数的定义如下:如果有个素数我们从右往左依次去掉一位数,每次去掉一位数剩下的数仍然是素数,那么我们称这个数是超级素数.例如7331,这是一个素数,从右往左依次去掉一位数733, 7 ...
- BAT脚本如何自动执行 adb shell 以后的命令
@echo off echo su > temp.txt echo 其它命令 >> temp.txt adb shell < temp.txt del temp.txt 求问 ...
- NOIP2015D2总结
今天居然考了一套题.NOIP2015D2. 这是当年的战绩: 360的一等奖线.好强啊! 之前做过2015的D1,但我确实不会做landlord……今天曾祥瑞学长和林可学姐都来了,他们说,朱昶宇AK, ...
- 牛客网NOIP赛前集训营-普及组(第一场)
前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...
- 【数学/贪心/DP】【CF1088E】 Ehab and a component choosing problem
Description 给定一棵 \(n\) 个节点的树,点有点权 \(a_u\),可能为负.现在请你在树上找出 \(k~(1~\leq~k~\leq~n)\) 个不相交集合,使得每个集合中的每对点都 ...
- python实现将IP地址转换为数字
话不多说,直接代码 ip_addr='192.168.2.10' # transfer ip to int def ip2long(ip): ip_list=ip.split('.') result= ...
- Ansible11:变量详解
目录 简单说明 一.在Inventory中定义变量 二.在Playbook中定义变量 1.通过vars关键字定义 2.通过vars_files关键字引入变量文件 3.通过vars_prompt来实现人 ...