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. Flink 操作链与任务槽

    Operator Chains(操作链) Flink出于分布式执行的目的,将operator的subtask链接在一起形成task(类似spark中的管道). 每个task在一个线程中执行. 将ope ...

  2. chrome浏览器安装vue调试器vue-devtools

    chrome浏览器安装vue调试器vue-devtools https://blog.csdn.net/zhangjnwei/article/details/76693053

  3. 如何安装Anaconda

    如何安装Anaconda Python作为一门易读.易维护的语言,在工作和学习中应用广泛,被大量用户所欢迎.本文主要给大家介绍一下Anaconda 步骤 1 Anaconda在官网就可以下载,网址:h ...

  4. weex框架

    weex优势: (1)支持ES6规范 (2)性能优异,开发简介标准,提及小巧. (3)跨平台 weex调试工具:weexplayground weex环境搭建: (1)安装 node.js.npm ( ...

  5. POJ 2521:How much did the businessman lose

    How much did the businessman lose Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9965 ...

  6. Angular全局数据管理与同步更新

    自定义实现angular中数据的状态管理,如有不妥请指正 一.先介绍一下rxjs中subject: Import {subject}from’rxjs’ Subject 数据的订阅与分发,结合报刊的发 ...

  7. mui 横屏 竖屏

    在项目中只有某个页面需要横屏 ,其他的都是竖屏展示的. 假设a页面横屏 ,返回之后竖屏 b页面 a+ 将其设置为横屏显示: b+ 将其设置为竖屏显示 但是进入a页面之后再返回b页面时 b页面也会称为横 ...

  8. springboot学习2 整合mybatis

    springboot整合mybatis 一.添加mybatis和数据库连接的依赖 <!--整合mybatis--> <dependency> <groupId>or ...

  9. 19 01 03 css 中 reset 模块 设置

    主要就是让到时候 打入代码时候  把一些bug去除   或者 让一些固有的格式取消 /* 将标签默认的间距设为0 */ body,p,h1,h2,h3,h4,h5,h6,ul,dl,dt,form,i ...

  10. delphi save .dfm to .txt

    procedure TForm2.saveDfm; var inStream,outStream:TMemoryStream; begin inStream:=TMemoryStream.Create ...