g++和gcc的区别

本文参考文章

gcc与g++比较

  1. 后缀为.c的,gcc将其视为C程序,g++视为C++程序;后缀为.cpp的,二者都认为是C++程序。C++语法相对更严谨一些

  2. 编译阶段,g++会调用gcc,通常编译/链接都使用g++。但gcc也可以编译cpp,只不过需要g++完成链接

  3. 编译可以用g++/gcc,而链接可以用g++或gcc -lstdc++。gcc命令不能自动和C++程序使用的库连接,所以通常使用g++连接;而编译阶段,g++调用gcc

gcc和g++包含头文件库文件方法

  1. -l 参数是用来指定程序要链接的库,-l 参数紧接的为库名。库名与库文件名关系:库名m,库文件名libm.so

  2. 在/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”

  3. -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语言文件后缀名为.piggcc -x c hello.pig

-x none filename 关掉上一个选项,让g++根据文件名后缀,自动识别文件类型。gcc -x c hello.pig -x none hello2.c