CherieLi Student

gcc编译

2019-10-16
CherieLi

安装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


上一篇 流控

Comments

Content