GCC编译器
- 不管gcc还是g++都可以编译C程序,编译程序的规则和参数相同;
- g++可以直接编译C++程序,gcc编译C++程序需要添加额外参数-lstdc++
- 不管是gcc还是g++都可以定义__cplusplus
实际使用中:
# 使用gcc指令编译C代码
#只用g++指令编译C++代码
#例如:
g++ test.cpp -o test
编译过程
- 预处理-Pre-Processing //.i文件
# -E 选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i //i文件
- 编译-Compilling //.s文件
# -s 编译选项告诉g++在为c++代码产生了汇编语言文件后停止编译
# g++产生的汇编语言文件的缺省扩展名是 .s
g++ -c test.s -o test.o
- 汇编-Assembling //.o文件
# -c选项告诉 g++ 仅把代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++ -c test.s -o test.o
4.链接-Linking
# -o 编译选项来为产生的可执行文件用指定的文件名
g++ test.o -o test
g++重要编译参数
- -g 编译带调试信息的可执行文件
# -g 在编译的时候生成调试信息,该程序可以被调试器调试,即编译带调试信息的可执行文件
# 产生带调试信息的可执行文件test
g++ -g test.cpp -o test
- -O[n] 优化源代码
# 所谓优化,例如省略代码中从未使用的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
# -O选项告诉g++对源代码进行基本优化,这些优化在多数情况下都会使程序执行的更快。-O2选项告诉g++产生尽可能小和尽可能快的代码,如-O2, -O3, -On(n常为0-3)
#最常用的是-O2
g++ -O2 test.cpp
#或
g++ test.cpp -O2 -o test
- -L和-l(小写L) 指定库文件 | 指定库文件路径
# -l参数(小写)就是指定程序要连接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
# 链接glog库
g++ -lglog test.cpp
# 如果库文件没有放在上面三个目录中,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在目录里
# 连接mytest库,libmytest.so 在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
- -I(directory,大写i)
# -I 指定include 包含文件的搜索目录
# /usr/include目录一般是不用指定的,gcc知道去哪里找,但是如果头文件不在/usr/include里面,我们就需要用-I参数指定了,比如头文件放在/myinclude目录中,那么编译命令行就要加上-I/myinclude 参数了,如果不加,将返回一个“xxx.h: No such file or directory”的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I来指定。上面提到的-cflags参数就是用来生成-I参数的。
g++ -I/myinclude test.cpp
- -Wall打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
- -w 关闭警告信息
# 关闭警告信息
g++ -w
- -std=c++11 设置编译标准
#使用-std=c++11 设置编译test.cpp
g++ -std=c++11 test
</