gcc和g++现在是gnu中最主要和最流行的c&c++编译器。g++是c++的命令,以.cpp为主;对于c语言后缀名一般为.c,这时候命令换做gcc即可。编译器是根据gcc还是g++来确定是按照C标准还是C++标准编译链接。

gcc和g++都是GNU(组织)的一个编译器。但两者有一些区别:后缀为.c的文件gcc把它当做c程序,g++当做c++程序。后缀为c++的两者都当做c++程序。对于cpp程序,无论gcc或者是g++编译阶段都是相同的,都是用的gcc进行编译,但是在链接阶段gcc不能自动和c++程序使用的库连接,如果使用的话,形如下:

gcc helloworld.cpp -lstdc++ -o helloworld
    所以我们通常用g++来进行连接(g++会自动连接c++常用库),所以为了使用方便对于cpp程序干脆编译链接统统都使用g++,这样就给人一种错觉,好像cpp只能用g++编译。

一. g++编译步骤

g++在执行编译工作的时候,总共需要以下几步(以源码Test.cpp为例):

    1.预处理,生成.i的文件[预处理器cpp]
    命令:

g++ -E Test.cpp > Test.i 
    功能:

输出预处理后的文件,linux下以.i为后缀名。只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 。这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的库文件。用编辑器打开Test.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。下面是Test.i文件的最后部分,可以看见宏的替换和注释的消除。
    2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]
    命令:

g++ -S Test.cpp
    功能:

会生成Test.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。

 3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
    命令:

  g++ -c Test.cpp 
    功能:

.o是GCC生成的目标文件,除非你是做编译器和连接器调试开发的,否则打开这种.o没有任何意义。

  4.连接目标代码生成可执行程序[链接器ld]
    命令:

g++ Test.o -o Test -l ACE
    功能:

将.o文件与所需的库文件链接整合形成可执行文件。至此完成。

二. gcc编译步骤

gcc在执行编译工作的时候,总共需要以下几步(以源码Test.cpp为例):

    1.预处理,生成.i的文件
    命令:

gcc -E Test.cpp -o Test.i 
    功能:

预处理阶段过程如下,预处理阶段是进行处理代码中的宏和include指令,并作语法检查。可以看到由于进行了预处理,将include内部的文件进行了替换,预处理后的结果文件显得特别大,所以在以后的程序中,没有用到的头文件最好不要引入,这样会降低处理时间和空间。
    2.将预处理后的文件转换成汇编语言,生成文件.s
    命令:

gcc -S Test.cpp
    功能:

会生成Test.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。

 3.由汇编变为目标代码(机器代码)生成.o的文件
    命令:

  gcc -c Test.s -o Test.o
    功能:

这一步是将汇编的代码进一步进行处理,每一个源程序都会生成相应的目标文件,是以.o为扩展名的文件。

  4.连接目标代码生成可执行程序
    命令:

gcc Test.o -o Test -l ACE
    功能:

将.o文件与所需的库文件链接整合形成可执行文件。至此完成。

三. gcc/g++常用参数说明

-E

只进行预处理选项,不进行汇编、目标文件生成和连接
    -S

生成汇编文件后停止,不进行目标文件生成和连接

-c

编译并生成目标文件,不进行连接(compile but not link)

-g
      只是编译器,在编译的时候,产生调试信息( insert debugging info in your exutable)

-o

生成指定的输出文件,用在生成可执行文件时(output file)
    -static

强制使用静态库
    -shared

强制使用共享库

-l library

      指定编译的时候使用的库( link a lib)
      例子用法:
          gcc -lcurses hello.c
      这个library就是ncurses库
    -L dir
      制定编译的时候,搜索库的路径(include and lib paths)。比如你自己的库,可以用它制定目录,不然
      编译器将只在标准库的目录找。这个dir就是目录的名称

-fPIC

表示编译为位置独立的代码( position independent code (dosen't work sometimes)),不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-Wall

表示打开报警提示信息(turn on warnings)

http://blog.csdn.net/xy365/article/details/7073023

Linux-编译器gcc/g++编译步骤的更多相关文章

  1. Linux 之 编译器 gcc/g++参数详解

    2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...

  2. Windows Sublime Text 配置Linux子系统(WSL)下的 gcc/g++ 编译环境

    0. 简介(若已了解背景可以跳过此部分) Windows 10 Build 14316以上版本中加入了"Windows系统的Linux子系统"(Windows Subsystem ...

  3. [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件

    在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...

  4. 学习总结:gcc/g++ 编译与链接

    gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...

  5. MinGW下载并配置gcc/g++编译环境

    本文将讲解如何下载MinGW并配置gcc\g++编译环境 一.下载MinGW 在MinGW官网中下载“mingw-get-setup.exe” 官网传送门:http://www.mingw.org/  ...

  6. 用gcc/g++编译winsock程序

    用gcc/g++编译winsock程序 D:\My\code>gcc -o getweb.exe getweb.c -lwin32socket 如果不加此句 -lwin32socket 编译会报 ...

  7. linux下使用gcc/g++编译代码时gets函数有错误

    今天在linux中使用个g++编译一个名为myfirst.cpp的代码的时候,出现如下错误 myfirst.cpp: In function ‘int main()’:myfirst.cpp:11:2 ...

  8. Linux系统安装gcc/g++详细过程

    下载: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2 浏览: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/ ...

  9. <转载>gcc/g++编译

    转载于:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/22/1782678.html 1. gcc/g++在执行编译工作的时候,总共需要4步 ...

随机推荐

  1. html5 和css3的小知识!

    阿里web字体的使用 (1)进入官网  点击webfont (2)输入对应的文字 然后选择添加字体 (3)可以直接引用线上地址或者本地下载,引用线上地址需要添加http,(在服务器环境下可以不用),如 ...

  2. 关于Socket的经验小结

    前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...

  3. 【ufldl tutorial】Softmax Regression

    今天太长姿势了,什么叫懂了也写不出代码说的不就是我吗,就那么几行代码居然叽叽歪歪写了一个小时. 首先exercise要实现的是softmax的cost function和gradient,如下图: ( ...

  4. 转:21副GIF动图让你了解各种数学概念

    21副GIF动图让你了解各种数学概念

  5. python字符串替换的2种有效方法

    python 字符串替换可以用2种方法实现:1是用字符串本身的方法.2用正则来替换字符串 下面用个例子来实验下:a = 'hello word'我把a字符串里的word替换为python1用字符串本身 ...

  6. Jquery_改变背景颜色

    $(this).addClass("car_check").siblings().removeClass("car_check");//设置全部车辆为选中状态

  7. mysql命令行登录指定编码

    mysql --default-character-set=utf8  -uroot -p mysql --default-character-set-utf8 -uroot-p

  8. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

  9. 通过yum安装nginx-mysql-php-fastcgi配置LNMP

    最近指想服务器跑静态文件,所以想单独配置个nginx的webserver,然而并不是我想象的那么简单,使用rpm包来安装会发生很多软件依赖的错误: 当我尝试使用yum安装nginx的时候,总是提示未找 ...

  10. 在Android上使用Google V8 JS 引擎

    在cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高.后来测试发现在大部分 ...