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. Java实现批量修改文件名称

    import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** ...

  2. poj3372 Candy Distribution

    可以证明: f(k) = k *(k - 1)/ 2 (1 ≤ k ≤ n)是n的完全剩余系当且仅当n = 2 ^ t. http://poj.org/problem?id=3372

  3. Tautology 分类: POJ 2015-06-28 18:40 10人阅读 评论(0) 收藏

    Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10428   Accepted: 3959 Descri ...

  4. 新建一个DataTable(只针对一列)

    /// <summary> /// 新建一个DataTable(只针对一列) /// </summary> /// <param name="dataStr&q ...

  5. python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

    1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...

  6. SharePoint自动化系列——Add/Remove “Hold” from items

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 问题1: 1.如果SharePoint item被添加了hold,通过UI界面来对SharePoi ...

  7. php获取 本月 本周 或者 下月 下周的 开始时间 结束时间

    <?php $now_time = time(); $date=date("Y-m-d",$now_time); function get_date($date,$t='d' ...

  8. java中的构造函数

    在c++中就学习了构造函数,今天学习java又碰到了构造函数,重新写一篇博客来理解一下 其实直接听这个词并不能理解这是什么,但其实看了它的作用,就很好理解了 当创建一个对象时,往往需要做一些初始化工作 ...

  9. 当插入数据失败时,防止mysql自增长字段的自增长的方法

    问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. ...

  10. [转]ZigBee On Windows Mobile--ZigBee模块天线设计

    原文出处:http://www.cnblogs.com/dearsj001/archive/2008/10/26/1320029.html