- 浏览: 194896 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
hagendashao:
此两本书都写的很细致,感谢楼主分享。
两本关于Hadoop的书 -
fireinwind:
wing_0 写道你好,
以 spark-0.7.0/run ...
关于spark各种蛋疼的事 -
wing_0:
你好,以 spark-0.7.0/run -jar /home ...
关于spark各种蛋疼的事 -
juluren:
参考http://apidoc.cn/archives/47h ...
Java往Excel写入海量数据 -
juluren:
http://apidoc.cn/archives/47
Java往Excel写入海量数据
The History of GCC
1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。
GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言越来越多,它的名称变成了GNU Compiler Collection。 这里介绍的gcc是GCC的前端,C编译器.
-Wall : 显示所有常用的编译警告信息。
-W : 显示更多的常用编译警告,如:变量未使用、一些逻辑错误。 -Wconversion : 警告隐式类型转换。 -Wshadow : 警告影子变量(在代码块中再次声明已声明的变量) -Wcast-qual :警告指针修改了变量的修饰符。如:指针修改const变量。 -Wwrite-strings : 警告修改const字符串。 -Wtraditional : 警告ANSI编译器与传统C编译器有不同的解释。 -Werror : 即使只有警告信息,也不编译。(gcc默认:若只有警告信息,则进行编译,若有错误信息,则不编译)
你可以在gcc的命令行中通过指定选项来选择相应的C语言标准: 从传统c到最新的GNU扩展C. 默认情况下, gcc使用最新的GNU C扩展.
-ansi : 关闭GNU扩展中与ANSI C相抵触的部分。 -pedantic : 关闭所有的GNU扩展。 -std=c89 : 遵循C89标准 -std=c99 : 遵循C99标准 -std=traditional : 使用原始C 注意:后4个选项可以与-ansi结合使用,也可以单独使用。 可在gcc中使用大量GNU C扩展. 生成特定格式的文件 以hello.c为例子,可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件:
$ gcc -Wall -c hello.c : 生成hello.o 多文件编译、连接 如果原文件分布于多个文件中:file1.c, file2,c 若对其中一个文件作了修改,则可只重新编译该文件,再连接所有文件: 注意:若编译器在命令行中从左向右顺序读取.o文件,则它们的出现顺序有限制:含有某函数定义的文件必须出现在含有调用该函数的文件之后。好在GCC无此限制。 编译预处理 以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc中指定-E选项, 或直接调用cpp.gcc的编译预处理命令程序为cpp,比较新版本的gcc已经将cpp集成了,但仍提供了cpp命令. 可以直接调用cpp命令, 也可以在gcc中指定-E选项指定它只进行编译预处理. $ gcc -E hello.c == $ cpp hello.c 上述命令马上将预处理结果显示出来. 不利于观看. 可采用-c将预处理结果保存: $ gcc -E -c hello.i hello.c == $ cpp -o hello.i hello.c 注意, -c指定名称要给出".i"后缀. 另外, gcc针对编译预处理提供了一些选项: (1) 除了直接在源代码中用 #define NAME来定义宏外,gcc可在命令行中定义宏:-DNAME(其中NAME为宏名), 也可对宏赋值: -DNAME=value 注意等号两边不能有空格! 由于宏扩展只是一个替换过程,也可以将value换成表达式,但要在两边加上双括号: -DNAME="statement" e.g. $ gcc -Wall -DVALUE="2+2" tmp.c -o tmp 如果不显示地赋值,如上例子,只给出:-DVALUE,gcc将使用默认值:1. (2) 除了用户定义的宏外, 有一些宏是编译器自动定义的,它们以__开头,运行: $ cpp -dM /dev/null, 可以看到这些宏. 注意, 其中含有不以__开头的非ANSI宏,它们可以通过-ansi选项被禁止。 查看宏扩展 1, 运行 $ gcc -E test.c ,gcc对test.c进行编译预处理,并立马显示结果. (不执行编译) 2, 运行 $ gcc -c -save-temps test.c ,不光产生test.o,还产生test.i, test.s,前者是编译预处理结果, 后者是汇编结果. 利用Emacs查看编译预处理结果 针对含有编译预处理命令的代码,可以利用emacs方便地查看预处理结果,而不需执行编译,更为方便的是,可以只选取一段代码,而非整个文件: 1,选择想要查看的代码 2,C-c C-e (M-x c-macro-expand) 这样,就自动在一个名为"Macroexpansion"的buffer中显示pre-processed结果. 生成汇编代码 使用"-S"选项指定gcc生成以".s"为后缀的汇编代码: $ gcc -S hello.c $ gcc -S -o hello.s hello.c 生成汇编语言的格式取决于目标平台. 另外, 如果是多个.c文件, 那么针对每一个.c文件生成一个.s文件. 包含头文件 在程序中包含与连接库对应的头文件是很重要的方面,要使用库,就一定要能正确地引用头文件。一般在代码中通过#include引入头文件, 如果头文件位于系统默认的包含路径(/usr/includes), 则只需在#include中给出头文件的名字, 不需指定完整路径. 但若要包含的头文件位于系统默认包含路径之外, 则有其它的工作要做: 可以(在源文件中)同时指定头文件的全路径. 但考虑到可移植性,最好通过-I在调用gcc的编译命令中指定。
下面看这个求立方的小程序(阴影语句表示刚开始不存在):
使用gcc-2.95来编译它(-lm选项在后面的连接选项中有介绍, 这里只讨论头文件的包含问题): 程序编译成功,但gcc给出警告: pow函数隐式声明。 明显执行结果是错误的,在源程序中引入头文件(#include <math.h>),消除了错误。
搜索路径 首先要理解 #include<file.h>和#include"file.h"的区别: UNIX类系统默认的系统路径为: 头文件,包含路径: /usr/local/include/ or /usr/include/ 对于标准c库(glibc或其它c库)的头文件, 我们可以直接在源文件中使用#include <file.h>来引入头文件. 如果要在源文件中引入自己的头文件, 就需要考虑下面的问题: 1, 如果使用非系统头文件, 头文件和源文件位于同一个目录, 如何引用头文件呢? 2, 对于比较大型的工程, 会有许多用户自定义的头文件, 并且头文件和.c文件会位于不同的目录. 又该如何在.c文件中引用头文件呢?
3, 还有一个比较猥琐的办法: 系统默认的包含路径不是/usr/include或/usr/local/include么? 我把自己的头文件拷贝到其中的一个目录, 不就可以了么? 的确可以这样, 如果你只想在你自己的机器上编译运行这个程序的话. 命令行设置 > 环境变量设置 > 系统默认 与外部库连接 前面介绍了如何包含头文件. 而头文件和库是息息相关的, 使用库时, 要在源代码中包含适当的头文件,这样才能声明库中函数的原型(发布库时, 就需要给出相应的头文件). 和包含路径一样, 系统也有默认的连接路径: 头文件,包含路径: /usr/local/include/ or /usr/include/ 库文件,连接路径: /usr/local/lib/ or /usr/lib/ 同样地, 我们想要使用某个库里的函数, 必须将这个库连接到使用那些函数的程序中.
除了C标准库之外的库称之为"外部库", 它可能是别人提供给你的, 也可能是你自己创建的(后面有介绍如何创建库的内容). 外部库有两种:(1)静态连接库lib.a (2)共享连接库lib.so 两者的共同点: 两者的区别: 共享库.so : 与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时, 那些需要的函数代码才被拷贝到内存中, 这样就使可执行文件比较小, 节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用).共享库还有个优点: 若库本身被更新, 不需要重新编译与它连接的源程序。 静态库 下面我们来看一个简单的例子,计算2.0的平方根(假设文件名为sqrt.c):
用gcc将它编译为可执行文件: 现在我用2.95版的gcc把sqrt.c再编译一次: 使用下列的命令可以成功编译:
这里还要注意连接顺序的问题,比如上述命令,如果我改成: 正如读取目标文件的顺序,gcc也在命令行中从左向右读取库文件——任何包含某函数定义的库文件必须位于调用该函数的目标文件之后! 指定库文件的绝对路径比较繁琐,有一种简化方法,相对于上述命令,可以用下面的命令来替代: 上面所提到的"libm.a"就是静态库文件,所有静态库文件的扩展名都是.a! 正如前面所说,默认的库文件位于/usr/lib/或/usr/local/lib/目录中。其中,libm.a是静态库文件,libm.so是后面会介绍的动态共享库文件。 如果调用的函数都包含在libc.a中(C标准库被包含在/usr/lib/libc.a中,它包含了ANSI C所定义的C函数)。那么没有必要显式指定libc.a:所有的C程序运行时都自动包含了C标准库!(试试 $ gcc-2.95 -Wall hello.c -o hello)。 共享库 正因为共享库的优点,如果系统中存在.so库,gcc默认使用共享库(在/usr/lib/目录中,库文件以共享和静态两种版本存在)。 运行:$ gcc -Wall -L. hello.c -lNAME -o hello 正如前面所说,共享库以.so为扩展名(so == shared object)。 那么,如果不想用共享库,而只用静态库呢?可以加上 -static选项 $ gcc-2.95 -Wall sqrt.c -static -lm -o sqrt_2.95_static $ ls -l sqrt* 上述用四种方式编译sqrt.c,并比较了可执行文件的大小。奇怪的是,-static -lm 和 /lib/libm.a为什么有区别?有知其原因着,恳请指明,在此谢谢了! :) 如果libNAME.a在当前目录,应执行下面的命令: 利用GNU archiver创建库 $ ar cr libhello.a hello_fn.o by_fn.o 关于创建库的详细介绍,可参考本blog的GNU binutils笔记 调试
一般地,可执行文件中是不包含任何对源代码的参考的,而debugger要工作,就要知道目标文件/可执行文件中的机器码对应的源代码的信息(如:哪条语句、函数名、变量名...). debugger工作原理:将函数名、变量名,对它们的引用,将所有这些对象对应的代码行号储存到目标文件或可执行文件的符号表中。
GCC提供-g选项,将调试信息加入到目标文件或可执行文件中。 解决方法: 优化 GCC具有优化代码的功能,代码的优化是一项比较复杂的工作,它可归为:源代码级优化、速度与空间的权衡、执行代码的调度。
GCC提供了下列优化选项: 注意:此处为O!(非0或小写的o,-o是指定可执行文件名)。 time测量指定程序的执行时间,结果由三部分组成: user和sys的和被称为CPU时间. 注意:对代码的优化可能会引发警告信息,移出警告的办法不是关闭优化,而是调整代码。 |
发表评论
-
脱机手写体汉字识别系统
2009-03-27 22:09 1233最近有幸接触到模式识别及文字识别这一领域,阅读了几篇论文。 ... -
启动RPC
2008-07-01 09:46 1168前几天刚和prolj兄在google code上开了个项目,取 ... -
词法分析和语法分析并发的想法
2008-05-17 10:32 1062现在看了几个简单的Compiler的源码,发现语法分析的Fun ... -
终于搞定VIM C开发环境
2008-05-13 16:54 3668花了两天时间终于把VIM写C的环境搞起来了,功能之强大,绝不逊 ... -
HTTP/1.1 Table Contents
2005-12-21 14:27 1485HTTP是一项应用于分布协 ... -
昨天玩了一下VI
2007-07-11 10:02 3583昨天花半天时间玩了一下VI,刚开始的时候看着黑黑的屏幕和稀奇古 ...
相关推荐
### GCC 学习笔记知识点详解 #### 一、GCC简介与版本检查 - **GCC**(GNU Compiler Collection)是一款开源的编译器集合,广泛应用于Linux等类Unix系统上,支持多种编程语言如C、C++等。 - **版本检查**: - 要...
### GCC 使用笔记详解 #### 一、GCC简介与历史 GCC(GNU Compiler Collection)是由Richard Stallman于1984年发起的GNU项目的一部分,旨在为开发者提供一套免费且功能强大的编译工具集。最初,GCC是作为GNU项目中...
cdlinux安装gcc, 操作流程字数补丁, 比较简单没什么好下载的
gcc工具链的选项笔记 gcc工具链的选项笔记是对GCC编译器的选项进行的详细记录和说明。GCC是 GNU 编译器集合(GNU Compiler Collection)的缩写,是一个自由和开放的编译器套件。GCC可以编译C、C++、Objective-C、...
- 源码安装完成后,可以通过`gcc --version`和`g++ --version`命令来验证GCC和GCC-C++是否成功安装,并查看其版本信息。 离线安装GCC与GCC-C++虽然过程相对复杂,但能确保在没有网络的环境中也能进行编译工作,这...
《使用GNU Compiler Collection (GCC) 12.1.0》是GNU Press出版的一本关于GCC的指南,由Richard M. Stallman和GCC开发者社区共同撰写。GCC,全称为GNU Compiler Collection,是一套广泛使用的开源编译器集合,支持...
GCC(GNU Compiler Collection)是GNU项目的一个核心组件,它是一个开源的编译器系统,用于将源代码编译成可执行程序。GCC支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada以及Go等。GCC手册是学习和使用...
GCC(GNU Compiler Collection)是GNU项目的一部分,是一个开源的、跨平台的编译器套件,主要用于C、C++、Objective-C、Fortran、Ada、Go等编程语言。它不仅包含编译器,还包括预处理器、链接器和其他相关工具。在...
标题“gcc _gcc_gcc”可能是在强调`gcc`这个关键词,`gcc`是GNU Compiler Collection(GNU编译器集合)的缩写,是一个广泛使用的开源编译器,支持C、C++、Objective-C、Fortran、Ada、Go等多种编程语言。 **描述...
**GCC(广义互相关)算法详解** GCC,全称为Generalized Cross Correlation,中文名为广义互相关,是一种在信号处理和模式识别领域广泛应用的算法。它主要用于估计两个信号的时间延迟,尤其适用于噪声环境中的声源...
根据所提供的文件信息,我们将详细解释如何通过YUM源在Linux系统中安装不同版本的GCC(GNU编译器集合)。首先,将讲述Linux系统中GCC的重要性,以及如何通过YUM源安装特定版本的GCC。接着,我们根据内容片段提供的...
gcc各版本文档,具体包括: gcc11_2、gcc10_3、gcc9_4、gcc8_5、gcc7_5、gcc6_5、gcc5_5、gcc4_9_4、gcc4_8_5、gcc4_7_4、gcc4_6_4、gcc4_5_4、gcc4_4_7、gcc4_3_6、gcc4_2_4、gcc4_1_2、gcc4_0_4、gcc3_4_6
本笔记主要围绕使用GCC 4.4.0编译器来实现JNI开发进行详细阐述。 首先,我们需要理解JNI的基本结构。JNI接口定义了一套函数,这些函数由Java虚拟机(JVM)提供,使得本地代码(如C/C++)能够与Java代码进行通信。当...
**tdm64-gcc安装包** `tdm64-gcc` 是一款专为Windows操作系统设计的64位版本的GCC(GNU Compiler Collection)编译器。GCC是开源的,由GNU项目维护,它包含了C、C++、Objective-C、Fortran、Ada和Go等多种编程语言...
在IT领域,尤其是在信号处理和通信工程中,"GCC"通常指的是广义互相关(Generalized Cross-Correlation,GCC)。GCC是一种用于估计两个信号之间相对时延的技术,尤其适用于存在噪声、失真或者非线性效应的情况。GCC...
TDM-GCC是一款Windows平台下GCC编译器,安装使用简单,适用于XP-Win10间的所有操作系统,它可以创建32位 或 64位的二进制文件。 mingw和tdm-gcc是什么关系 相同点: 一、 他们都是用于编译生成Windows应用程序的...
GCC,全称GNU Compiler Collection,是GNU项目的一部分,是一套由GNU开发的开源编译器套件,用于将源代码转换为计算机可执行的程序。GCC支持多种编程语言,包括C、C++、Fortran、Ada和Objective-C等。版本11.2是GCC...
GCC(GNU Compiler Collection)是GNU项目的一个核心组件,它是一个开源的、跨平台的编译器集合,用于将源代码转换成可执行程序。GCC 支持多种编程语言,包括C、C++、Fortran、Ada和Go等。在Linux和类Unix系统中,...
GCC,全称GNU Compiler Collection(GNU编译器集合),是由GNU项目开发并维护的一套开源编译工具集。它不仅包含C、C++、Fortran、Ada和Objective-C等编程语言的编译器,还提供了预处理器、链接器及其他相关的工具。...