安装GCC(以4.8.5为例):
a.下载所需要的rpm包,gcc需要安装比较多的rpm包,而且不同rpm包之间具有依赖关系,需要按照一定顺序安装,这里推荐直接下载附件;
b.把下载好的附件解压,复制到Linux环境下,例如复制到~/home文件夹下;
c.执行 cd /home/gcc-4.8.5 ,进入该目录下,执行 rpm -ivh –force *,等待安装完成即可;
d.执行 gcc –version,出现版本号说明gcc安装成功。
g++ test.cpp --verbose -I/home/lzy
https://bbs.huaweicloud.com/blogs/308450
https://colobu.com/2018/08/28/15-Most-Frequently-Used-GCC-Compiler-Command-Line-Options/
15个最常用的GCC编译器参数
1. 指定编译输出的名字
生成一个a.out文件
gcc main.c
使用参数-o, 可以指定输出的文件名。
gcc main.c -o main
2. 通过-Wall参数启用所有警告
gcc -Wall main.c -o main
3. 使用-E参数只产生预处理输出
gcc -E main.c > main.i
gcc命令将结果输出在stdout中,所以你可以把它重定向到任意的文件中,在上面的例子中,重定向到main.i文件中。
4. 使用-S参数只产生汇编代码
gcc -S main.c > main.s
文件main.s包含汇编代码。
5. 使用-C参数只产生编译的代码
gcc -C main.c
代码产生main.o, 包含机器级别的代码或者编译的代码。
-C参数只产生编译的代码(没有链接link)。
6. 使用-save-temps参数产生所有的中间步骤的文件
$ gcc -save-temps main.c
$ ls
a.out main.c main.i main.o main.s
7. 使用-l参数链接共享库
gcc -Wall main.c -o main -lCPPfile
上面的代码会链接libCPPfile.so,产生可执行文件main。
pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
gcc -o test -lpthread test.c
8. 使用-fPIC产生位置无关的代码
$ gcc -c -Wall -Werror -fPIC Cfile.c
$ gcc -shared -o libCfile.so Cfile.o
产生共享库的时候使用了-fPIC参数。
注意-shared产生共享库
9. 使用-V打印所有的执行命令
$ gcc -Wall -v main.c -o main
Using built-in specs.
COLLECT_GCC=gcc
……
10. 使用-ansi参数支持 ISO C89程序
ISO C89不支持C++风格的注释
11. 使用-funsigned-char将char解释为符号的char
$ gcc -Wall -funsigned-char main.c -o main
$ ./main
The Geek Stuff [246]
通过这个参数, char类型被看作为 unsigned char类型
12. 使用-fsigned-char将char解释为有符号的char
$ gcc -Wall -fsigned-char main.c -o main
$ ./main
The Geek Stuff [-10]
使用这个参数, char类型被看作是有符号的
13. 使用-D参数可以使用编译时的宏
$ gcc -Wall -DMY_MACRO main.c -o main
$ ./main
可以看到宏MY_MACRO被定义了,并打印出了结果。
14. 使用-Werror将警告升级为错误
$ gcc -Wall -Werror main.c -o main
15. 使用@参数从文件中读取参数
$ cat opt_file
-Wall -omain
$ gcc main.c @opt_file
16. 使用参数-I指定头文件的文件夹
gcc -I/home/codeman/include input-file.c
17. 使用参数-std指定支持的c++/c的标准
gcc -std=c++11 hello-world.cpp
标准如 c++11, c++14, c90, c89等。
g++ -g -Wall -std=c++11 main.cpp
18. 使用-static生成静态链接的文件
gcc main.c -static -o main -lpthread
使用-shared使用动态库链接。
19. 使用-static-libstdc++静态链接libstdc++
如果没有使用-static,默认使用libstdc++共享库,而-static-libstdc++可以指定使用libstdc++静态库。
20. 使用-M生成文件关联的信息
gcc -M main.c
gcc 命令的常用选项
http://www.runoob.com/w3cnote/gcc-parameter-detail.html
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 | 生成所有警告信息。 |
-funroll-loops
gcc来检查代码,进行循环展开,减少循环次数提高性能
gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
https://blog.csdn.net/qq_31108501/article/details/51842166
-O0: 不做任何优化,这是默认的编译选项。
-O和-O1: 对程序做部分编译优化。使用本项优化,编译器会尝试减小生成代码的尺
寸,以及缩短执行时间。
打开的优化选项:
-fdefer-pop 延迟栈的弹出时间。
-fmerge-constants 尝试横跨编译单元合并同样的常量
-fthread-jumps 分支重定向
-floop-optimize 常量表达式从循环中移除,简化判断循环的条件
-fif-conversion 将条件跳转转换为等价的无分支型式
-fif-conversion2
-fdelayed-branch 根据指令周期时间重新安排指令
-fguess-branch-probability 采用随机模式猜测分支被执行的可能性
-fcprop-registers 减少调度依赖性并且删除不必要的寄存器复制操作
-O2: 是比O1更高级的选项,进行更多的优化。提高了生成代码的执行效率。
-fforce-mem
-foptimize-sibling-calls
-fstrength-reduce
-fcse-follow-jumps
-fcse-skip-blocks
-frerun-cse-after-loop
-frerun-loop-opt
-fgcse-lm
-fgcse-sm
-fgcse-las
-fdelete-null-pointer-checks
-fexpensive-optimizations
-fregmove
-fschedule-insns
-fschedule-insns2
-fsched-interblock
-fsched-spec-load
-fcaller-saves
-fpeephole2
-freorder-blocks
-freorder-functions
-fstrict-aliasing
-funit-at-a-time
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-fcrossjumping
-O3:比O2更进一步的进行优化。
-finline-functions
-fweb
-frename-registers
-funswitch-loops
-Os: 主要是对程序的尺寸进行优化。
Os会关闭如下选项: -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -fprefetch-loop-arrays
O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。
O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
O3在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。
Os主要是对代码大小的优化,我们基本不用做更多的关心。 通常各种优化都会打乱程序的结构,让调试工作变得无从着手。并且会打乱执行顺序,依赖内存操作顺序的程序需要做相关处理才能确保程序的正确性。
gcc参数详解
http://www.runoob.com/w3cnote/gcc-parameter-detail.html
100个gcc小技巧
https://wizardforcel.gitbooks.io/100-gcc-tips/content/address-sanitizer.html