1,gcc与g++的问题:

1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。

2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。

当我们常规使用gcc编译一个程序时,他通常执行4个步骤:预编译,编译,汇编,连接.

当然我们可以通过指定某个选项来使它停止在某个步骤上.

指定GCC进行的操作的选项

  -E :让GCC仅进行预处理;得到 .i 文件;

  -S :让GCC仅进行预处理,编译;得到 .s 文件;

  -c :让GCC仅进行预处理,编译,汇编;得到 .o 文件;

  -o Ouput:指定输出文件,让GCC仅进行预处理,编译,汇编,连接;得到 可执行文件(默认为a.out);

控制输出信息

  -w:禁止输出所有警告信息

  -Wall:输出所有警告信息

  -Werror:将所有警告信息当成错误信息输出。

调试相关选项(生成调试信息)

  -g:生成用于GDB调试程序使用的调试信息

  -p:生成用于prof程序使用的调试信息

  -pg:生成用于gprof程序使用的调试信息

程序优化选项

  -O,-O1:初步优化(会占用更多时间进行编译,但是编译后的程序运行时占用的内存更少)

  -O2:比-O1更进一步优化

  -O3:比-O2更进一步优化

  -O0:不进行优化

宏操作

  -D name:定义宏name的值为1,类似在源程序中使用#define name 1

  -D name=val:定义宏name的值为val,类似#define name val

  -U name:取消宏name的定义,类似#undef name

  -undef:取消所有系统指定或GCC指定的宏定义,但保留标准预定义的宏

指定搜索目录

  -I dir,-Idir:追加目录dir到头文件的搜索路径中

  -L dir,-Ldir:追加目录dir到库文件的搜索路径中

  -Bprefix:指定gcc查找库文件,头文件,数据文件的目录

指定使用的库文件,头文件

  -nostdinc:不使用标准头文件(默认在/usr/include)

  -nostdlib:不使用标准库文件(默认在/usr/lib)

  -l library:指定使用的库文件,默认gcc在编译一个程序时只连接到标准c库 上,是用该选项能够使他连接到指定的库上,例如若你要连接到数学库上(libm.a)则你只须指定 -lm就可以了。也就是说这个选项指定连接的库文件可以将前缀lib和后缀.a(或.so)省略。

  -nostartfiles:不使用标准的系统的startup文件

指定连接库文件的方式

  -shared:动态连接到库文件上,这是默认行为。

  -static:静态连接到库文件上

  注:动态连接和静态连接的区别在于:动态连接是在程序运行时才连接到库文件上(也就是需要用到时才连接上),而静态连接则是在编译时就将程序连接到库文件中(这样做会增大程序,但便于移植)

备注:

-选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。

参考:

http://blog.chinaunix.net/uid-27040051-id-3444056.html

http://www.ha97.com/2884.html

gcc常用指令及相关知识的更多相关文章

  1. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)

    最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...

  2. gcc 常用指令

    gcc hello.c    直接编译默认输出 a.out可执行文件 gcc hello.c -o hello    生成名字为hello的可执行文件 gcc hello.c -o hello -Wa ...

  3. Java常用类Date相关知识

    Date:类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串. Dat ...

  4. X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  5. redis基础:redis下载安装与配置,redis数据类型使用,redis常用指令,jedis使用,RDB和AOF持久化

    知识点梳理 课堂讲义 课程计划 1. REDIS 入 门 (了解) (操作)   2. 数据类型 (重点) (操作) (理解) 3. 常用指令   (操作)   4. Jedis (重点) (操作) ...

  6. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  7. ROS零门槛学渣教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh

    Linux常用指令通过上一教程,我们获得了ubuntu系统.Linux是一个很大的领域.但不要紧张,我们一步步来就是了,跟着教程,需要能用到新知识,会提前介绍给大家.下面学习几个常用的Linux指令. ...

  8. [转帖]xserver相关知识汇总

    xserver相关知识汇总 https://blog.csdn.net/QTVLC/article/details/81739984   本文主要是从以下几个方面介绍xorg-xserver 相关的知 ...

  9. CSAPP阅读笔记-gcc常用参数初探-来自第三章3.2的笔记-P113

    gcc是一种C编译器,这次我们根据书上的代码尝试着使用它. 使用之前,先补充前置知识.编译器将源代码转换为可执行代码的流程:首先,预处理器对源代码进行处理,将#define指定的宏进行替换,将#inc ...

随机推荐

  1. Asp.net mvc5 系列笔记

    程序版本 vs 2015  1.0.0-beta4  ,得到你的肯定是我最大的动力. Asp.net Vnext 调试源码 Asp.net Vnext 自定义日志 Asp.net Vnext 中间件实 ...

  2. [ios][swift]swift GPS传感器的调用

    在Info.plist文件中添加如下配置:(1)NSLocationAlwaysUsageDescription(2)NSLocationWhenInUseUsageDescription swift ...

  3. YTU 3001: 判断操作是否合法(栈和队列)

    3001: 判断操作是否合法(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 4  解决: 2 题目描述 假设以I和O分别表示进栈和出栈操作,栈的初态和终态均为空,进栈和出栈的 ...

  4. 利用Selenium自动化web测试

    简介: Selenium 是一个没有正式指导手册的开源项目,这让测试人员的问题调查很费时间.本文为基于 Selenium 1.0(发布于 2009 年 6 月)的测试期间的常见问题提供最佳实践. 简介 ...

  5. The shortest problem

    The shortest problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  6. 周赛-The Number Off of FFF 分类: 比赛 2015-08-02 09:27 3人阅读 评论(0) 收藏

    The Number Off of FFF Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  7. 使用工具创建Ribbon的按钮

         来自为知笔记(Wiz)

  8. WebForm组合查询

    封转类 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <sum ...

  9. Date日期比对

    Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); calendar1. ...

  10. [C语言](*p)++与 ++(*p)与 *p++ 与 ++*p

    首先亮明个人观点,不要认为这样写都算写的不好,还强调大神一般不写这种代码,可读性不高 其实是你的C语言基础太差,读不懂,大神还真的就是这么写的.可以看看C语言库函数中的一些写法 *P++ :*和++都 ...