gcc编译器的介绍及使用基础
2014-07-17 21:06
246 查看
gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
一、编译过程
使用gcc编译程序时,编译过程可被细分为四个阶段:
(1)预处理(也称预编译,Preprocessing)
(2)编译(Compilation)、
(3)汇编汇编(Assembly)
(4)链接 (Linking)。
1、预处理:
预处理阶段,编译器将代码中的stdio.h的代码编译进来,用户使用-E选项进行查看
gcc -E hello.c -o
hello.i
2、编译:
gcc首先检查语法的规范性以及是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码编译成汇编语言。
gcc -S hello.i -o
hello.s
3、汇编
把编译生成的.s文件转换成目标文件
gcc -c hello.s -o
hello.o
4、链接
在该阶段,在这里涉及一个重要的概念:函数库。在这个程序中并没有定义“printf"的函数实现,在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf"函数的呢?
最后的答案是:系统把这些函数实现都己经被放入名为libc.
so.6的库文件中去了,在没有特别指定时库函数中去,GCC会到系统默认的搜索路径“/usr/Iib”下进行查找,也就是链接到libc.so.6这
样就能实现函数“printf"了,而这也就是链接的作用。
Gcc hello.o –o hello
初学时最好从命令行入手,这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi或其它编辑器编写。
编译则使用gcc命令。要往下学习首先就得熟悉gcc命令的用法。
gcc命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。
一. 常用编译命令选项
假设源程序文件名为test.c。
1. 无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。
2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
3. 选项 -E
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。
4. 选项 -S
用法:#gcc -S test.i
作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项 -c
用法:#gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接
用法:#gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test。
7. 选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
-O2,比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。
A)#include
B)#include "myinc.h"
其中,A类使用尖括号(),B类使用双引号(“
”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,
而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,
就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,
就需要逐个使用-I选项给出搜索路径。
-Ldirname,将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld
在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如
果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。
-lname,在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。
9.static选项:GCC在默认情况下链接的是动态库,有时为了把一些函数静态编译到程序中,而无需链接动态库就采用-static选项,它会强制程序连接静态库。
例如,-lm表示连接名为“libm.a”的数学函数库。
例如hello.c
#include
void main(void)
{
printf("welcome to linux world!");
}
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
一、编译过程
使用gcc编译程序时,编译过程可被细分为四个阶段:
(1)预处理(也称预编译,Preprocessing)
(2)编译(Compilation)、
(3)汇编汇编(Assembly)
(4)链接 (Linking)。
1、预处理:
预处理阶段,编译器将代码中的stdio.h的代码编译进来,用户使用-E选项进行查看
gcc -E hello.c -o
hello.i
2、编译:
gcc首先检查语法的规范性以及是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码编译成汇编语言。
gcc -S hello.i -o
hello.s
3、汇编
把编译生成的.s文件转换成目标文件
gcc -c hello.s -o
hello.o
4、链接
在该阶段,在这里涉及一个重要的概念:函数库。在这个程序中并没有定义“printf"的函数实现,在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf"函数的呢?
最后的答案是:系统把这些函数实现都己经被放入名为libc.
so.6的库文件中去了,在没有特别指定时库函数中去,GCC会到系统默认的搜索路径“/usr/Iib”下进行查找,也就是链接到libc.so.6这
样就能实现函数“printf"了,而这也就是链接的作用。
Gcc hello.o –o hello
初学时最好从命令行入手,这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi或其它编辑器编写。
编译则使用gcc命令。要往下学习首先就得熟悉gcc命令的用法。
gcc命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。
一. 常用编译命令选项
假设源程序文件名为test.c。
1. 无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。
2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
3. 选项 -E
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。
4. 选项 -S
用法:#gcc -S test.i
作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项 -c
用法:#gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接
用法:#gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test。
7. 选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
-O2,比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。
7. 选项-g gcc -g产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 8-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include
B)#include "myinc.h"
其中,A类使用尖括号(),B类使用双引号(“
”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,
而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,
就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,
就需要逐个使用-I选项给出搜索路径。
-Ldirname,将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld
在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如
果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。
-lname,在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。
9.static选项:GCC在默认情况下链接的是动态库,有时为了把一些函数静态编译到程序中,而无需链接动态库就采用-static选项,它会强制程序连接静态库。
例如,-lm表示连接名为“libm.a”的数学函数库。
例如hello.c
#include
void main(void)
{
printf("welcome to linux world!");
}
相关文章推荐
- 在Ubuntu下安装GCC编译器及GCC编译器的基本使用命令介绍
- Linux下C语言编程基础知识--gcc编译器的使用、MakeFile文件的编写
- Linux入门gcc编译器的使用简易介绍
- Linux入职基础-7.2_gcc编译器简单使用
- 在Source Insight中使用WinAVR编译器GCC
- 如何在Windows下使用gcc编译器
- GCC编译器的使用
- GCC编译器的使用
- GCC编译器的使用
- gcc编译器使用学习笔记
- GCC编译器的使用
- GCC编译器的使用
- C编译器LCC-win32的使用介绍
- Linux下编程工具的使用(2) - GCC编译器
- GCC 使用手册和常用功能介绍
- Linux GCC编译器的使用(实例)
- GCC编译器的使用
- GCC编译器的使用
- GCC编译器的使用
- GCC编译器的使用