g++和gcc区别与使用
g++和gcc的区别
本文参考
gcc与g++比较
-
后缀为.c的,gcc将其视为C程序,g++视为C++程序;后缀为.cpp的,二者都认为是C++程序。C++语法相对更严谨一些
-
编译阶段,g++会调用gcc,通常编译/链接都使用g++。但gcc也可以编译cpp,只不过需要g++完成链接
-
编译可以用g++/gcc,而链接可以用g++或gcc -lstdc++。gcc命令不能自动和C++程序使用的库连接,所以通常使用g++连接;而编译阶段,g++调用gcc
gcc和g++包含头文件库文件方法
-
-l 参数是用来指定程序要链接的库,-l 参数紧接的为库名。库名与库文件名关系:库名m,库文件名libm.so
-
在/lib,/usr/lib和/usr/local/lib中的库可直接用 -l 参数链接,当显示”/usr/bin/ld: cannot find -lxxx”,则在上述目录中无法找到libxxx.so。 可使用 -L 参数,直接调用某目录下的库文件,libtest.so在/aaa/bbb/ccc目录下,”-L /aaa/bbb/ccc -ltest”
-
-include 用来包含头文件,但一般情况下包含头文件都是在源码中实现的。 -I 是用来指定头文件目录的,默认目录为/usr/include,可用 -I 参数指定目录,如头文件放在/myinclude中,使用”-I /myinclude”
g++命令参数
参考g++编译命令选项,gcc/g++ 常用参数和g++参数介绍
总体选项
-E 只激活预处理,不生成文件,需要将其重定向到一个输出文件里面,gcc -E hello.c > pianoapan.txt ; gcc -E hello.c | more
,生成非常多行的代码
-S 只激活预处理和编译,就是指把文件编译称为汇编代码,gcc -S hello.c
,生成hello.s的汇编代码,可以用文本编辑器查看
-c 只激活预处理,编译和汇编,即只生成obj文件,gcc -c hello.c
,生成hello.o
目录选项
-l 需要链接的库名称,即连接库文件去掉lib前缀和.so后的部分,例如libev.so
就是-lev
,则g++ -lev hello.c
-L 链接库文件的搜索路径,默认链接库的搜索路径为/lib
和/usr/lib
,例如g++ -lev -L /usr/local/lib/ hello.c
-I include头文件的搜索路径,优先搜索此路径下的头文件,默认头文件的路径为当前目录./
和./usr/include /usr/local/include
-include file 相当于#include,gcc hello.c -include /root/pianopan.h
g++ -Wall -g main.cpp -L /usr/local/lib/ -lopencv_imgproc -lopencv_imgcodecs \
-lopencv_highgui -lopencv_core -o opencv
g++ -Wall -g -o opencv main.cpp /usr/local/lib/libopencv_imgcodecs.so \
/usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_core.so
调试选项
-g 增加调试信息,在编译的时候,产生调试信息
-gstabs 此选项以stabs格式声称调试信息,但是不包括gdb调试信息
-gstabs+ 此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息
-ggdb 此选项将尽可能的生成gdb的可以使用的调试信息
链接方式选项
-static 此选项将进制使用动态库,则编译处理处理的东西一般很大,也不需要动态链接库即可运行
-shared 编译成动态链接库,通常用在简历共享库时,需要配合参数-fPIC使用
错误与警告选项
-w 不生成任何警告信息
-Wall 生成所有警告信息
预处理选项
-imacros file 将file文件的宏,拓展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
-undef 取消对任何非标准宏的定义
其他选项
-o 制定目标名称,缺省的时候,g++编译出来的是a.out,gcc -o hello hello.c
-pipe 使用管道代替编译中临时文件,在使用非GNU汇编工具的时候,可能会有些问题,gcc -pipe -o hello.exe hello.c
-ansi 关闭GNU C与ANSI C不兼容的特性,激活ANSI C的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX等预处理宏)
-O0, O1, O2, O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-x language filename 设定文件所使用的语言,使后缀无效,对其后的多个参数有效。例如修改C语言文件后缀名为.pig
,gcc -x c hello.pig
-x none filename 关掉上一个选项,让g++根据文件名后缀,自动识别文件类型。gcc -x c hello.pig -x none hello2.c