• g++使用总结


             学习C和C++的同学应该都知道,gcc是一款跨平台的C/C++编译器,可以在Linux/Windows平台下使用,具有十分强大的功能,结构也十分灵活,并且可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada的编译。许多有名的工程和库都是使用gcc进行编译的,如nginx,libevent等。今天我们重点介绍gcc组件中可以用来编译C++程序的g++组件的使用。

            g++可以在命令行使用,也可以通过配置IDE的编译环境来调用系统配置的g++环境,大家可以根据需要自行配置。下面是一些博主本人使用g++编译程序的一些经验和总结。

    1. g++编译过程

      g++在对源程序执行编译工作时,需要经过以下四个步骤:

     (1) 预处理:对源程序中的宏定义、包含头文件等进行处理,生成后缀名为.i的文件(使用)

     使用格式:

    g++ -E hello.cpp -o hello.i

       hello.cpp是需要编译的源文件,-o 选项指定输出的文件名。这里使用-E选项编译生成hello.i 文件

     (2) 转化为汇编文件:使用-S 选项,可以将预处理之后的.i文件转换为目标机器的汇编代码.S文件

     使用格式:

    g++ -S hello.i  -o  hello.s

      使用该参数可以将.i 文件编译生成.s 文件,输出文件名同样使用-o 选项指定。

    (3) 汇编文件->目标文件,即转换为机器代码:使用-c选项

     使用格式:

    g++ -c hello.s -o hello.o

    (4) 链接:将上一步产生的目标文件链接为可执行文件,使用-o参数

    使用格式:

    g++ hello.o  -o  hello

         以上过程是g++工具编译cpp源程序的具体过程,在实际使用时我们可以不用按照流程一步步编译,可以一步到位将源程序编译为可执行文件,只需要使用如下命令:

    g++  hello.cpp -o  hello

      2.g++常用编译选项

         在使用g++工具进行编译时,我们可以附加一些编译选项让编译更加智能,从而方便我们查看编译错误和警告。g++提供了许多有用的编译选项,下面总结一些常用选项:

      -o FILE: 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out

      -c: 只编译生成目标文件,不链接

     -m486: 针对 486 进行代码优化

     -Wall: 允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告

      使用格式: 

    1 g++ -Wall hello.cpp -o hello

     -Werror: 把所有警告转换为错误,以在警告发生时中止编译过程;

     -v: 显示在编译过程的每一步中用到的命令 ;

    -static: 链接静态库,即执行静态链接,g++默认是链接动态库,如果需要链接静态库需要使用本选项进行指定;

    -g: 在可执行程序中包含标准调试信息, 使用该选项生成的可执行文件可以用gdb工具进行调试;

    -w: 关闭所有警告,建议不要使用该选项

    -shared: 生成共享目标文件。通常用在建立共享库时;

    -On: 这是一个优化选项,如果在编译时指定该选项,则编译器会根据n的值(n取0到3之间)对代码进行不同程度的优化,其中-O0 表示不优化,n的值越大,优化程度越高;

     -L: 库文件依赖选项,该选项用于指定编译的源程序依赖的库文件路径,库文件可以是静态链接库,也可以是动态链接库,linux系统默认的库路径是/usr/lib,如果需要的库文件不在这个路径下就要用-L指定

    g++  foo.cpp  -L/home/lib  -lfoo  -o   foo

     -I: 该选项用于指定编译程序时依赖的头文件路径,linux平台默认头文件路径在/usr/include下,如果不在该目录下,则编译时需要使用该选项指定头文件所在路径

    gcc  foo.cpp  -I/home/include   -o  foo

     3.编译动态库

      g++除了可以编译源程序生成可执行文件,也可以编译动态链接库,方法如下:

     (1) 分步完成

    gcc -fPIC -c func.cpp -o func.o 
    gcc -shared -o libfunc.so func.o

     (2) 一步完成

    gcc -fPIC -shared -o libfunc.so func.cpp

     4. make和Makefile

          上面已经介绍了g++工具在命令行的使用,我们可以使用g++在命令行来对单个或者多个源程序文件进行编译。但是,如果遇到需要同时编译许多文件的情况,g++命令行编译就太麻烦了,这个时候就需要使用make进行自动化编译。我们可以编写make工具的规则文件——Makefile,在该文件中定义一些编译的规则,然后利用make工具自动调用g++进行批量编译,这样可以大大提高效率。有兴趣的同学可以自行查找make的使用,这里就不展开了。

     

    参考资料:

     1.https://blog.csdn.net/kwame211/article/details/84560400

     2.https://blog.csdn.net/drdairen/article/details/53740092

       

  • 相关阅读:
    关于开发 Web AI 的思考(kendryte K210)
    怪不得我说,这几个月的代码数据都跑哪里去了....
    在 Android 上使用蓝牙作为主机进行一对多从机传输数据的实测,理论 5
    写了一下 micropython 的文件系统单元测试
    mark 自己未来要写一下,蓝牙主机一对多从机和 K210 的网络通信优化过程。
    VUE实现Studio管理后台(五):手风琴式折叠组件(Accordion)
    VUE实现Studio管理后台(四):状态模式实现窗口停靠,灵动、自由
    VUE实现Studio管理后台(三):支持多语言国际化(vue-i18n)
    VUE实现Studio管理后台(二):Slot实现选项卡tab切换效果,可自由填装内容
    VUE实现Studio管理后台(一):鼠标拖放改变窗口大小
  • 原文地址:https://www.cnblogs.com/chenwx-jay/p/gcc.html
Copyright © 2020-2023  润新知