gcc和g++的区别解析
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++的区别解析的更多相关文章
- Linux - gcc和g++的区别
一般linux系统都自带了gcc编译器的,你可以用你的安装光盘去安装,如果你是觉得自带的gcc版本太低了,可以去gcc的官方网站可以下载到,编译需要很长的时间,如果你只编译C或者C++可以只下载gcc ...
- 【转载】gcc和g++的区别
[说明]本文转载自 静心 的文章 http://blog.163.com/lu_jun520/blog/static/5699613420116205148239/ 一般linux系统都自带了gcc编 ...
- gcc和g++的区别【转自中国源码网】
gcc和g++的区别[转自中国源码网] gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是 ...
- linux中gcc和g++的区别
1.两者都是编译器 2.gcc编译c语言:g++既可以编译c语言,也可以编译c++语言 3.gcc不能自动链接库文件,一般用g++来链接库文件,非要用gcc的话,一般使用gcc -lstdc++命令 ...
- gcc 与 g++的区别
原文: http://www.cnblogs.com/wb118115/p/5969775.html ------------------------------------------------- ...
- 【C/C++】Linux的gcc和g++的区别
Windows中我们常用vs来编译编写好的C和C++代码:vs把编辑器,编译器和调试器等工具都集成在这一款工具中,在Linux下我们能用什么工具来编译所编写好的代码呢,其实Linux下这样的工具有很多 ...
- 结合python版本安装python-devel gcc和g++的区别 安装前做yum搜索
[test@ecs autocloudservices]# yum install python-develLoaded plugins: fastestmirrorLoading mirror sp ...
- gcc 与g++的区别
原文 http://www.cnblogs.com/wb118115/p/5969775.html 什么是gcc / g++ 首先说明:gcc 和 GCC 是两个不同的东西 GCC:GNU Compi ...
- gcc和g++的区别:安装、版本、编译(转)
用以下命令: yum install gcc 安装的只有gcc,而不会安装g++.gcc是编译器合集,而gcc-g++或简称g++则是C++编译器.gcc成为了编译器的选择器.gcc通过识别被编译的源 ...
随机推荐
- 我们是如何将 ToB 服务的交付能力优化 75%?
ToB 服务交付的方式分为公有云部署和私有化部署两种.其中,对成本敏感的中小企业往往采用公有云部署的方式,从而尽量减少成本.客单价较高的大型企业.政府.银行和事业单位,考虑到数据隐私.安全.合规等要求 ...
- js基础学习之-js对象的属性
Js属性 1. 设置属性 1) 对象. 2) 对象[‘属性名’] 3) GetAttribute函数 2. 获取属性 1) 变量=对象. 2) 变量=对象[‘属性名’] 3) GetAt ...
- [BJDCTF2020]The mystery of ip
0x00 知识点 SSTI模板注入: 之前也写过: https://www.cnblogs.com/wangtanzhi/p/12238779.html SSTI模板注入: 模板注入涉及的是服务端We ...
- MySQL8.0安装caching_sha2_password问题
MySQL安装之后无法用工具连接上本地数据库 详情原因可见: https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-pl ...
- 面试官,不要再问我“Java 垃圾收集器”了(转载)
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...
- cf 609E.Minimum spanning tree for each edge
最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...
- JSTL与EL表达式(为空判断)
JSTL与EL表达式(为空判断) 一.循环遍历集合 1.在jsp中引入标准函数声明 <%@ taglib uri="http://java.sun.com/jsp/jstl/cor ...
- SASS - 输出格式
SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...
- linux中redis伪主从搭建
1.解压redis.tgz到usr/local/redis下 2.在redis/下执行 make 3.在redis/src/下执行 make install PREFIX=/usr/local/red ...
- MySQL授权用户登录访问指定数据库
使用Navicat等客户端工具,选中需要共享的数据库,点击查询>新建查询 1.写SQL语句:GRANT ALL PRIVILEGES ON * TO 'test'@'%'IDENTIFIED B ...