目录
注:
1、以下测试在ubuntu 9.10(32位)上进行,其他平台未测试
2、本文只是我个人的理解,不一定完全正确
3、版权所有,转载请注明作者和出处
一、gcc简介
1、GCC:GNU Compiler Collection,即gcc就是GNU的一个编译套件,简单粗暴的理解为gcc就是一个编译器吧
2、GNU:GNU is a Unix-like operating system,即GNU就是一个类unix的操作系统,认为它是一个软件或者工具的名字就行。如果非得纠结GNU到时是什么的话,你会得到:The name “GNU” is a recursive acronym for “GNU's Not Unix.” ,到这里还是有疑问what is the fuck GUN,下面找到的这段话能解释为啥GNU就是GNU。
下面一段转自:https://zhidao.baidu.com/question/1862899834098229547.html
递归缩写即递归首字缩写,是一种在全称中递归引用它自己的缩写。
在计算机领域黑客社区中一个较早的传统(特别是在麻省理工大学)就是使用幽默地引用自身或其他缩写的缩写。最早的实例可能是在1977年或1978年间出现的 TINT ("TINT Is NotTECO",TINT不是文字编辑器和修正器),它是一个 MagicSix 的编辑器。这又启发了麻省理工大学的两个Lisp Machine 编辑器的命名,一个叫做 EINE ("EINE Is NotEmacs",EINE不是 Emacs),另一个是 ZWEI ("ZWEI Was EINEInitially",ZWEI一开始是EINE)。后来又有了 Richard Stallman的 GNU (GNU's not UNIX,GNU不是UNIX)。许多递归缩写包括否定语,通常用来指出这个缩写指代的事物 a 不是与另一个事物 b 相类似(但事实上,这个事物 a 通常与 b 非常相似甚至是 b 的衍生品)
3、英文版详细介绍见下面的连接及下文
GCC, the GNU Compiler Collection
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user's freedom.
We strive to provide regular, high quality releases, which we want to work well on a variety of native and cross targets (including GNU/Linux), and encourage everyone to contribute changes or help testing GCC. Our sources are readily and freely available via Git and weekly snapshots.
Major decisions about GCC are made by the steering committee, guided by the mission statement.
二、gcc安装
1、输入命令即可安装
apt-get install gcc
2、查看gcc版本:输入gcc -v
三、常用命令
Usage: gcc [options] file...
Options:
-v Display the programs invoked by the compiler
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>
-nostdlib 不包含标准库,常用于裸机和bootloader编译时使用
-static 静态链接,不加此选项的话是动态链接
参数详解:
-v:产看版本号或者显示编译过程
-E:只进行预处理,不进行编译、汇编或链接【运行后会产生 *.i文件】
-S:只进行编译,不汇编或链接 【运行后会产生 *.s文件】
-c:编译和汇编 【运行后会产生 *.o文件】
-o:指定输出的路径和文件名 【不带上述参数,默认执行链接操作,产生可执行文件】
gcc -v -nostdlib -o hello hello.o 会提示没有链接系统标准文件和标准库而链接失败
四、实例
1、常规编译、使用
方法一:分布操作、执行
gcc -E -o hello.i hello.c 【预处理,产生*.i文件】
gcc -S -o hello.s hello.i 【仅编译,产生*.s文件】
gcc -c -o hello.o hello.s 【编译和汇编,产生*.o文件】
gcc -o hello hello.o 【链接,产生可执行文件】
方法二:简单分布执行
gcc -c -o hello.o hello.c 【编译和汇编,默认进行预处理操作】
gcc -o hello hello.o 【链接】
方法三:一步到位
gcc -o hello hello.c
2、动态链接、静态链接
gcc -o hello_shared hello.o 【动态连接】
gcc -static -o hello_static hello.o【静态连接】
3、示例:静态编译产生的文件较大
五、总结
C/C++文件——》预处理——》产生*.i文件——》编译——》生产*.s文件——》汇编——》产生*.o文件——》链接——》产生可执行文件
2020-04-06 北京 天气热了