3.0 本讲目录
本系列视频,B站首发,up主: xiaobing1016
前言:
GCC 编译器支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序;
Linux 开发C/C++一定要熟悉 GCC
VSCode是通过调用GCC编译器来实现C/C++的编译工作的;
实际使用中:
使用 gcc 指令编译 C 代码
使用 g++指令编译 C++ 代码
3.1 编译过程
预处理-Pre-Processing //.i文件
2g++-Etest.cpp-otest.i//.i文件1#-E选项指示编译器仅对输入文件进行预处理
编译-Compiling // .s文件
2#g++产生的汇编语言文件的缺省扩展名是.s 3g++-Stest.i-otest.s1#-S编译选项告诉g++在为C++代码产生了汇编语言文件后停止编译
汇编-Assembling// .o文件
2#缺省时 g++建立的目标代码文件有一个 .o 的扩展名。 3g++-ctest.s-otest.o1#-c选项告诉g++仅把源代码编译为机器语言的目标代码
链接-Linking // bin文件
2g++test.o-otest1#-o编译选项来为将产生的可执行文件用指定的文件名
3.2 g++重要编译参数
-g编译带调试信息的可执行文件
2 3#产生带调试信息的可执行文件test 4g++-gtest.cpp1#-g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
-O[n]优化源代码
2 3#-O 选项告诉 g++对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2 选项告诉 g++产生尽可能小和尽可能快的代码。如-O2,-O3,-On(n 常为0–3) 4#-O同时减小代码的长度和执行时间,其效果等价于-O1 5#-O0表示不做优化 6#-O1为默认优化 7#-O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。 8#-O3 则包括循环展开和其他一些与处理特性相关的优化工作。 9#选项将使编译的速度比使用-O 时慢,但通常产生的代码执行速度会更快。 10 11#使用-O2优化源代码,并输出可执行文件 12g++-O2test.cpp1##所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
-l 和 -L指定库文件 | 指定库文件路径
2#在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接 3 4#链接glog库 5g++-lglogtest.cpp 6 7#如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录 8#-L参数跟着的是库文件所在的目录名 9 10#链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下 11g++-L/home/bing/mytestlibfolder-lmytesttest.cpp1#-l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
-I指定头文件搜索目录
2#/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/icnclude里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的。 3 4g++-I/myincludetest.cpp1#-I
-Wall打印警告信息
2g++-Walltest.cpp1#打印出gcc提供的警告信息
-w关闭警告信息
2g++-wtest.cpp1#关闭所有警告信息
-std=c++11设置编译标准
2g++-std=c++11test.cpp1#使用c++11标准编译test.cpp
-o指定输出文件名
2 3#指定输出可执行文件名为test 4g++test.cpp-otest1#指定即将产生的文件名
-D定义宏
2 3#常用场景: 4#-DDEBUG定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭DEBUG1#在使用gcc/g++编译的时候定义宏
示例代码:
2 3#include 4 5intmain() 6{ 7#ifdefDEBUG 8printf("DEBUGLOG\n"); 9#endif 10printf("in\n"); 11} 12 13//1.在编译的时候,使用gcc-DDEBUGmain.cpp 14//2.第七行代码可以被执行1//-Dname定义宏name,默认定义内容为字符串“1”
注:使用man gcc
命令可以查看gcc英文使用手册
3.3 【实战】g++命令行编译
案例:最初目录结构: 2 directories, 3 files
2. 3├──include 4│└──Swap.h 5├──main.cpp 6└──src 7└──Swap.cpp 8 92directories,3files1#最初目录结构
3.3.1 直接编译
最简单的编译,并运行
2g++main.cppsrc/Swap.cpp-Iinclude 3#运行a.out 4./a.out1#将main.cppsrc/Swap.cpp编译为可执行文件
增加参数编译,并运行
2g++main.cppsrc/Swap.cpp-Iinclude-std=c++11-O2-Wall-ob.out 3#运行b.out 4./b.out1#将main.cppsrc/Swap.cpp编译为可执行文件附带一堆参数
3.3.2 生成库文件并编译
链接静态库生成可执行文件①:
2$cdsrc 3 4#汇编,生成Swap.o文件 5g++Swap.cpp-c-I../include 6#生成静态库libSwap.a 7arrslibSwap.aSwap.o 8 9##回到上级目录 10$cd.. 11 12#链接,生成可执行文件:staticmain 13g++main.cpp-Iinclude-Lsrc-lSwap-ostaticmain1##进入src目录下
链接动态库生成可执行文件②:
2$cdsrc 3 4#生成动态库libSwap.so 5g++Swap.cpp-I../include-fPIC-shared-olibSwap.so 6##上面命令等价于以下两条命令 7#gccSwap.cpp-I../include-c-fPIC 8#gcc-shared-olibSwap.soSwap.o 9 10##回到上级目录 11$cd.. 12 13#链接,生成可执行文件:sharemain 14g++main.cpp-Iinclude-Lsrc-lSwap-osharemain1##进入src目录下
编译完成后的目录结构
最终目录结构:2 directories, 8 files
2. 3├──include 4│└──Swap.h 5├──main.cpp 6├──sharemain 7├──src 8│├──libSwap.a 9│├──libSwap.so 10│├──Swap.cpp 11│└──Swap.o 12└──staticmain 13 142directories,8files1#最终目录结构
3.3.3 运行可执行文件
运行可执行文件①
2./staticmain1#运行可执行文件
运行可执行文件②
2LD_LIBRARY_PATH=src./sharemain1#运行可执行文件
END
扫码关注公众号
微信号 : iVSCode
bilibili : xiaobing1016