1.误区:gcc只能编译C源代码,g++只能编译C++源代码

  解析:其实gcc和g++都可以编译c/c++源代码,只是细节不同,后缀名为.c的源文件,gcc将其当作C程序,而g++则当作c++程序来处理;后缀名为.cpp的源文件,gcc和g++都会当作C++程序来处理。编译阶段,g++会调用gcc来进行编译,但由于gcc不能链接程序所使用的库,所以需要通过g++来链接库文件,即在编译阶段都是使用gcc来进行编译,但当进入链接阶段的时候,由于gcc无法自动链接库文件,要想使用gcc链接库文件必须使用选项-lstdc++,而g++则会自动链接,为了方便起见,对于.cpp的文件就直接使用g++来进行编译和链接。

2.一个c/c++程序是经过以下几个阶段完成编译链接生成可执行文件的

  (1)预处理阶段:一段程序中通常会包括宏定义和头文件包含,预处理阶段就是对这两者进行处理,同时包含了语法检查,该阶段命令为gcc -E hello.c -o hello.i,生成一个hello.i文件,hello.i文件特别大,是因为将头文件进行了替换添加到了程序中

  (2)生成汇编文件:对生成的hello.i预处理文件进行汇编生成汇编文件hello.s,该阶段命令为gcc -S hello.i -o hello.s

  (3)由汇编文件生成目标文件:对汇编文件hello.s进行进一步处理,使每个源程序生成一个目标文件hello.o,该阶段命令为gcc -c hello.s -o hello.o

  (4)链接目标文件和库函数文件,生成可执行文件:在链接阶段,将目标文件和库文件链接起来,生成最终的可执行文件,该阶段命令为gcc hello.o -o hello

  (5)运行可执行文件hello

3.静态库

  (1)什么是库:库是写好的现有的可以复用的代码,库有两种:静态库(.a、.lib)和动态库(.so、.dll)

  (2)静态库:之所以称为静态库,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,因此对应的链接方式称为静态链接。其实静态库可以简单的看成是一组目标文件的集合,即许多目标文件通过压缩打包后形成的一个文件;

  (3)静态库的特点:静态库对函数的链接是放在编译时期完成的;程序在运行时与函数库再无瓜葛,移植方便;空间和资源消耗比较大,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件

  (4)Linux下静态库命名规范:必须是"lib[your_library_name].a",lib为前缀,中间是静态库名,扩展名为.a

  (5)创建静态库:首先,将源文件编译为目标文件,g++ -c hello.cpp;然后通过ar工具将目标文件打包成静态库文件,ar -crv libhello.a hello.o,生成静态库libhello.a。注意:大一点的项目就需要编写makefile文件来生成静态库了,毕竟输入命令比较麻烦

  (6)使用静态库:Linux下使用静态库,只需要在编译的时候,指定静态库的搜索路径(-L选项)、指定静态库名(不需要lib前缀和.a后缀,使用-l选项),如:g++ test.cpp -L"path" -lhello

4.动态库

  (1)动态库的产生是由于静态库会造成大量空间浪费并且静态库对于程序的更新重新部署发布会很麻烦,只要静态库发生变化,程序就需要重新编译再发布。动态库在程序编译时并不会被链接到代码中,而是在程序运行时才被载入。不同的程序如果调用相同的库,那么内存中只需要有一份实例即可。

  (2)动态库特点:库函数在程序运行时才被载入;可以实现进程间的资源共享;程序升级更新简单,只需要更新库文件无需重新编译程序;

  (3)创建动态库:Linux下与创建静态库不同的是,不需要打包工具,直接使用编译器即可创建动态库

  (4)动态库的命名规则:动态链接库的名字形式为libxxxx.so,前缀是lib,后缀为.so

  (5)创建动态库:首先生成目标文件,g++ -fPIC -c hello.cpp(-fPIC创建于地址无关的编译程序,是为了能够在多个程序间共享);然后生成动态库,此时要加连接器选项-shared,g++ -shared -o libhello.so hello.o;也可以合并为一句命令:g++ -fPIC -shared -o libhello.so hello.cpp

  (6)使用动态库的方式和使用静态库的方式是一样的

总结:动态库和静态库的最大不同就在于被载入的时间不同,静态库在程序编译时会被链接到代码中,程序运行时不再需要静态库,因此体积较大。而动态库则是在程序运行时才被载入,因此在程序运行时还需要动态库存在,因此体积较小。

gcc和g++的区别解析的更多相关文章

  1. Linux - gcc和g++的区别

    一般linux系统都自带了gcc编译器的,你可以用你的安装光盘去安装,如果你是觉得自带的gcc版本太低了,可以去gcc的官方网站可以下载到,编译需要很长的时间,如果你只编译C或者C++可以只下载gcc ...

  2. 【转载】gcc和g++的区别

    [说明]本文转载自 静心 的文章 http://blog.163.com/lu_jun520/blog/static/5699613420116205148239/ 一般linux系统都自带了gcc编 ...

  3. gcc和g++的区别【转自中国源码网】

    gcc和g++的区别[转自中国源码网] gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是 ...

  4. linux中gcc和g++的区别

    1.两者都是编译器 2.gcc编译c语言:g++既可以编译c语言,也可以编译c++语言 3.gcc不能自动链接库文件,一般用g++来链接库文件,非要用gcc的话,一般使用gcc -lstdc++命令 ...

  5. gcc 与 g++的区别

    原文: http://www.cnblogs.com/wb118115/p/5969775.html ------------------------------------------------- ...

  6. 【C/C++】Linux的gcc和g++的区别

    Windows中我们常用vs来编译编写好的C和C++代码:vs把编辑器,编译器和调试器等工具都集成在这一款工具中,在Linux下我们能用什么工具来编译所编写好的代码呢,其实Linux下这样的工具有很多 ...

  7. 结合python版本安装python-devel gcc和g++的区别 安装前做yum搜索

    [test@ecs autocloudservices]# yum install python-develLoaded plugins: fastestmirrorLoading mirror sp ...

  8. gcc 与g++的区别

    原文 http://www.cnblogs.com/wb118115/p/5969775.html 什么是gcc / g++ 首先说明:gcc 和 GCC 是两个不同的东西 GCC:GNU Compi ...

  9. gcc和g++的区别:安装、版本、编译(转)

    用以下命令: yum install gcc 安装的只有gcc,而不会安装g++.gcc是编译器合集,而gcc-g++或简称g++则是C++编译器.gcc成为了编译器的选择器.gcc通过识别被编译的源 ...

随机推荐

  1. 051-PHP求余运算

    <?php $x=10%5; //进行求余运算 $y=10%3; //进行求余运算 $z=10%6; //进行求余运算 echo $x; //输出变量x的值 echo $y; //输出变量y的值 ...

  2. Power BI 安装注册教程

    把下载好的MSI包PBIDesktop_x64.msi 双击安装 点击下一步 选择文件路径 点击安装 点击完成 初始化中 安装完成界面 账号注册 https://powerbi.microsoft.c ...

  3. POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询

    本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样, ...

  4. 腾讯云服务器上搭建Jenkins配置邮箱通知

    1,Jenkins 点击 系统管理 2,点击系统管理 3,配置系统管理员邮件地址 5,配置 Extended E-main Notification,(用户名不需要邮箱后缀“@163.com”, SS ...

  5. Linux用户管理 权限管理 内存管理 网络管理命令 (第四天)

    默认添加的用户会自动加入和用户名一样的组中su 切换用户查看当前登陆的用户: whoami id`查看当前用户属于哪个组:groupsgroupadd 组名 添加组groupdel 组名 删除组gre ...

  6. The hierarchy of the type is inconsistent

    原因:我看到有一个interface的java类里面import了一个没有用到的类,手贱,把这个接口里面引用了但是没有没有用到的类删掉了, 结果这个接口的子类用到了,统统报标题上的错误.只要把删掉的改 ...

  7. jetty启动项目后js修改后无法保存

    在web.xml中加入如下配置即可: <servlet> <servlet-name>default</servlet-name> <servlet-clas ...

  8. 67.ORM查询条件:range的使用,使用make_aware将navie time 转换为aware time

    模型的定义,models.py文件中示例代码如下: from django.db import models # 在定义模型的类时,一定要继承models.Model class Category(m ...

  9. 十、CI框架之通过参数的办法输出URI路径

    一.代码如下,index函数有2个参数 二.效果如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  10. VScode 修改中文字体

    打开vscode ctrl+,打开设置 找到font,第一个是首选的英文字体,第二个是中文字体.