900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

时间:2021-07-01 01:40:49

相关推荐

把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

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

1#-E选项指示编译器仅对输入文件进行预处理

2g++-Etest.cpp-otest.i//.i文件

编译-Compiling // .s文件

1#-S编译选项告诉g++在为C++代码产生了汇编语言文件后停止编译

2#g++产生的汇编语言文件的缺省扩展名是.s

3g++-Stest.i-otest.s

汇编-Assembling// .o文件

1#-c选项告诉g++仅把源代码编译为机器语言的目标代码

2#缺省时 g++建立的目标代码文件有一个 .o 的扩展名。

3g++-ctest.s-otest.o

链接-Linking // bin文件

1#-o编译选项来为将产生的可执行文件用指定的文件名

2g++test.o-otest

3.2 g++重要编译参数

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

1#-g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。

2

3#产生带调试信息的可执行文件test

4g++-gtest.cpp

-O[n]优化源代码

1##所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。

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.cpp

-l 和 -L指定库文件 | 指定库文件路径

1#-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.cpp

-I指定头文件搜索目录

1#-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.cpp

-Wall打印警告信息

1#打印出gcc提供的警告信息

2g++-Walltest.cpp

-w关闭警告信息

1#关闭所有警告信息

2g++-wtest.cpp

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

1#使用c++11标准编译test.cpp

2g++-std=c++11test.cpp

-o指定输出文件名

1#指定即将产生的文件名

2

3#指定输出可执行文件名为test

4g++test.cpp-otest

-D定义宏

1#在使用gcc/g++编译的时候定义宏

2

3#常用场景:

4#-DDEBUG定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭DEBUG

示例代码:

1//-Dname定义宏name,默认定义内容为字符串“1”

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.第七行代码可以被执行

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

3.3 【实战】g++命令行编译

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

1#最初目录结构

2.

3├──include

4│└──Swap.h

5├──main.cpp

6└──src

7└──Swap.cpp

8

92directories,3files

3.3.1 直接编译

最简单的编译,并运行

1#将main.cppsrc/Swap.cpp编译为可执行文件

2g++main.cppsrc/Swap.cpp-Iinclude

3#运行a.out

4./a.out

增加参数编译,并运行

1#将main.cppsrc/Swap.cpp编译为可执行文件附带一堆参数

2g++main.cppsrc/Swap.cpp-Iinclude-std=c++11-O2-Wall-ob.out

3#运行b.out

4./b.out

3.3.2 生成库文件并编译

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

1##进入src目录下

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-ostaticmain

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

1##进入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-osharemain

编译完成后的目录结构

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

1#最终目录结构

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,8files

3.3.3 运行可执行文件

运行可执行文件①

1#运行可执行文件

2./staticmain

运行可执行文件②

1#运行可执行文件

2LD_LIBRARY_PATH=src./sharemain

END

扫码关注公众号

微信号 : iVSCode

bilibili : xiaobing1016

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。