Linux 下 gcc 与 g++的差别
参考网易博客者“静心”的博客——《gcc与g++的区别》结合自己的认识做出的个人领悟。(由于个人水平有限,难免会存在错误的地方,请见谅)
一般而言,在Linux下编译程序分为以下4个阶段:
- 预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件
- 编译:将预处理后的文件转换成汇编语言——生成后缀为“.s”的文件
- 汇编:由汇编生成的文件翻译为二进制目标文件——生成后缀为“.o”的文件
- 连接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件——生成后缀为“.out”的文件
在Linux下执行gcc与g++编译C++文件的差别:
- 后缀为.c的,gcc把它当作是C程序(cc/cpp才判定为C++源程序),而g++当作是c++程序
- gcc无法进行库文件的连接,即无法编译完成步骤4;而g++则能完整编译出可执行文件。(实质上,g++从步骤1-步骤3均是调用gcc完成,步骤4连接则由自己完成)
下面进行一次简单的测试:
测试环境:CentOS 6.4
测试命令:
- gcc -E 执行到步骤1,只处理宏命令,需要用重定向生成文件
- gcc -S 执行到步骤2,生成文件.s
- gcc -c 执行到步骤3,生成文件.o
- g++ 分别编译于连接 .cc文件与.o文件
测试代码:
#include <iostream>
using namespace std;
int main()
{
cout<<"This is a C++ program."<<endl;
}
测试结果:
gcc -E 1.cc >> 1.i

vi 1.i

gcc -S 1.cc

vi 1.s

gcc -c 1.cc

接下来测试g++ 1.o 与直接g++ 1.cc的结果:
g++ 1.o -o from_o

运行结果:

g++ 1.cc -o from_cc

运行结果:

若直接用gcc编译链接c++文件会出错,因无法链接。
gcc 1.cc

- 后缀为.c的,gcc把它当作是C程序(cc/cpp才判定为C++源程序),而g++当作是c++程序
- gcc无法进行库文件的连接,即无法编译完成步骤4;而g++则能完整编译出可执行文件。(实质上,g++从步骤1-步骤3均是调用gcc完成,步骤4连接则由自己完成)
- gcc -E 执行到步骤1,只处理宏命令,需要用重定向生成文件
- gcc -S 执行到步骤2,生成文件.s
- gcc -c 执行到步骤3,生成文件.o
- g++ 分别编译于连接 .cc文件与.o文件
#include <iostream>
using namespace std;
int main()
{
cout<<"This is a C++ program."<<endl;
}
测试结果:
gcc -E 1.cc >> 1.i
vi 1.i
gcc -S 1.cc
vi 1.s
gcc -c 1.cc
g++ 1.o -o from_o
运行结果:
g++ 1.cc -o from_cc
运行结果:
gcc 1.cc
Linux 下 gcc 与 g++的差别的更多相关文章
- Linux下gcc与g++用法以及编写makefile
1. gcc与g++编译流程: 1) 编译流程: 2) 预处理:生成.i的预处理文件. Ø 只激活预处理,这个不生成文件,需要把它重定向一个输出文件. ...
- Linux下gcc和g++的区别
首先编写了第一个C++程序,Hello,world! #include <iostream> using namespace std; void main() ...{ cout < ...
- Linux下gcc和g++编译helloworld
linux C(hello world) 1.使用vi/vim进行编写代码并保存为hello_world.c.如下: 1 2 3 4 5 6 /* This is my first C program ...
- Linux下gcc,g++,gdb,scon部分用法笔记
1 Ubuntu下编译安装GCC-4.1.2 拷贝gcc-4.1.2.tar.bz2(我下载的压缩文件)到/usr/local/src 解压 新生成的gcc-4.1.2这个目录被称为源目录,用${sr ...
- linux 安装gcc和g++
linux中安装gcc和g++ 今天在linux的服务器上安装C/C++的编译器gcc和g++,运行了如下两条命令: 1 yum install gcc yum install g++ 然后发现gcc ...
- Linux中gcc和g++
今天在Linux上编写一个小的C++程序运行,需要用到iostream中cout,一开始创建一个hello.c的文件编写如下代码: #include<stdio.h> #include&l ...
- Linux下gcc与gdb简介
gcc编译器可以将C.C++等语言源程序.汇编程序编译.链接成可执行程序.gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具. linux下没有后缀名的概念.但 gcc 根据文件的后 ...
- linux下gcc编译多个源文件、gdb的使用方法
一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
随机推荐
- July 06th 2017 Week 27th Thursday
Knowledge is the antidote to fear. 知识可以解除恐惧. Fear always steps from unknown things. Once we know wha ...
- 使用burpsuite对移动app抓包分析
测试移动APP的联网请求,需要获取路径或者参数的时候,使用该工具burpsuite非常方便! 要求: 移动终端和PC处于同一个wlan环境下 第一步:获取本地地址,cmd-->ipconfig ...
- 两种MVC框架比较
基于Web的MVC framework在J2EE的世界内已是空前繁荣. TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框 ...
- Spring Framework5.0 学习(4)—— 基本概念
1.0 控制反转(IOC)/依赖注入(DI) 通过依赖注入(DI),对象的依赖关系将由负责协调系统关系中各个对象的第三方组件在创建对象是设定.对象无需自行创建或管理它们的依赖关系——依赖关系将被自动 ...
- 如何遍历一个JSON对象的属性值???
当遇到一个JSON格式的对象时,不知道它有多少个属性,也不知道有什么属性,该如何遍历它的属性及其属性值呢??? 还是使用Java语言还是很像的,使用for语句. var obj = data[i]; ...
- Python中返回SQL字段名
def ReturnInfo(self, avalue, akey): cursor = connection.cursor() if type(avalue) == int: Sql = " ...
- [19/03/26-星期二] 容器_Map(图、键值对、映射)接口之HashMap(散列映射)&TreeMap(树映射)
一.概念&方法 现实生活中,我们经常需要成对存储某些信息.比如,我们使用的微信,一个手机号只能对应一个微信账户,这就是一种成对存储的关系. Map就是用来存储“键(key)-值(value) ...
- 5.spring:注解配置 Bean
在classpath中扫描组件 组键扫描:能够从classpath下自动扫描,侦测和实例化具有特定注解的组件 特定的组件包括: ->@Componment:基于注解,标识一个受Spring管理的 ...
- MacType 文字之美 – 让 Windows 字体更漂亮
苹果的Mac系统总能让人眼前一亮,除了其精美的软件界面设计外,最重要是其文字显示效果(渲染方式)比 Windows 更加清晰锐利,阅读起来更加舒服.于是就有高手开发了一款叫 GDI++ 的字体渲染引擎 ...
- nodejs中如何连接mysql
nodejs中如何连接mysql,下面给出一个小Demo. 第一步安装mysql模块npm install mysql 第二步导入mysql模块var mysql = require('mysql') ...