所在的位置: C++ >> C++优势 >> 基于VSCode和CMake进行CC

基于VSCode和CMake进行CC

白癜风病友微信群 http://liangssw.com/bozhu/12747.html
3.0本讲目录

本系列视频,B站首发,up主:xiaobing

前言:

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文件

1#-E选项指示编译器仅对输入文件进行预处理2g++-Etest.cpp-otest.i//.i文件

编译-Compiling//.s文件

1#-S编译选项告诉g++在为C++代码产生了汇编语言文件后停止编译2#g++产生的汇编语言文件的缺省扩展名是.s3g++-Stest.i-otest.s

汇编-Assembling//.o文件

1#-c选项告诉g++仅把源代码编译为机器语言的目标代码2#缺省时g++建立的目标代码文件有一个.o的扩展名。3g++-ctest.s-otest.o

链接-Linking//bin文件

1#-o编译选项来为将产生的可执行文件用指定的文件名2g++test.o-otest3.2g++重要编译参数

-g编译带调试信息的可执行文件

1#-g选项告诉GCC产生能被GNU调试器GDB使用的调试信息,以调试程序。23#产生带调试信息的可执行文件test4g++-gtest.cpp

-O[n]优化源代码

1##所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。23#-O选项告诉g++对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2选项告诉g++产生尽可能小和尽可能快的代码。如-O2,-O3,-On(n常为0–3)4#-O同时减小代码的长度和执行时间,其效果等价于-O15#-O0表示不做优化6#-O1为默认优化7#-O2除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。8#-O3则包括循环展开和其他一些与处理特性相关的优化工作。9#选项将使编译的速度比使用-O时慢,但通常产生的代码执行速度会更快。#使用-O2优化源代码,并输出可执行文件12g++-O2test.cpp

-l和-L指定库文件

指定库文件路径

1#-l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名2#在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接34#链接glog库5g++-lglogtest.cpp67#如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录8#-L参数跟着的是库文件所在的目录名#链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下11g++-L/home/bing/mytestlibfolder-lmytesttest.cpp

-I指定头文件搜索目录

1#-I2#/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/icnclude里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个”xxxx.h:Nosuchfileordirectory”的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的。34g++-I/myincludetest.cpp

-Wall打印警告信息

1#打印出gcc提供的警告信息2g++-Walltest.cpp

-w关闭警告信息

1#关闭所有警告信息2g++-wtest.cpp

-std=c++11设置编译标准

1#使用c++11标准编译test.cpp2g++-std=c++11test.cpp

-o指定输出文件名

1#指定即将产生的文件名23#指定输出可执行文件名为test4g++test.cpp-otest

-D定义宏

1#在使用gcc/g++编译的时候定义宏23#常用场景:4#-DDEBUG定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭DEBUG

示例代码:

1//-Dname定义宏name,默认定义内容为字符串“1”23#includestdio.h45intmain()6{7#ifdefDEBUG8printf("DEBUGLOG\n");9#endif10printf("in\n");11}//1.在编译的时候,使用gcc-DDEBUGmain.cpp14//2.第七行代码可以被执行

注:使用mangcc命令可以查看gcc英文使用手册

3.3g++命令行编译

案例:最初目录结构:2directories,3files

1#最初目录结构2.3├──include4│└──Swap.h5├──main.cpp6└──src7└──Swap.cppdirectories,3files3.3.1直接编译

最简单的编译,并运行

1#将main.cppsrc/Swap.cpp编译为可执行文件2g++main.cppsrc/Swap.cpp-Iinclude3#运行a.out4./a.out

增加参数编译,并运行

1#将main.cppsrc/Swap.cpp编译为可执行文件附带一堆参数2g++main.cppsrc/Swap.cpp-Iinclude-std=c++11-O2-Wall-ob.out3#运行b.out4./b.out3.3.2生成库文件并编译

链接静态库生成可执行文件①:

1##进入src目录下2cdsrc34#汇编,生成Swap.o文件5g++Swap.cpp-c-I../include6#生成静态库libSwap.a7arrslibSwap.aSwap.o89##回到上级目录10cd..#链接,生成可执行文件:staticmain13g++main.cpp-Iinclude-Lsrc-lSwap-ostaticmain

链接动态库生成可执行文件②:

1##进入src目录下2cdsrc34#生成动态库libSwap.so5g++Swap.cpp-I../include-fPIC-shared-olibSwap.so6##上面命令等价于以下两条命令7#gccSwap.cpp-I../include-c-fPIC8#gcc-shared-olibSwap.soSwap.o##回到上级目录11cd..#链接,生成可执行文件:sharemain14g++main.cpp-Iinclude-Lsrc-lSwap-osharemain

编译完成后的目录结构

最终目录结构:2directories,8files

1#最终目录结构2.3├──include4│└──Swap.h5├──main.cpp6├──sharemain7├──src8│├──libSwap.a9│├──libSwap.so10│├──Swap.cpp11│└──Swap.o12└──staticmaindirectories,8files3.3.3运行可执行文件

运行可执行文件①

1#运行可执行文件2./staticmain

运行可执行文件②

1#运行可执行文件2LD_LIBRARY_PATH=src./sharemain

END

扫码


转载请注明:http://www.aierlanlan.com/grrz/75.html