Linux_1.1_ GCC程序编译
2015-06-14 10:18
387 查看
讲解思路目录:
1.1 GCC特点:
1.2 GCC基本用法:
简单测试:
1) touch hello.c
创建一个hello.c文件.
touch命令不过多解释,详情请点击打开链接
也可以直接使用vim创建,此处为了多练习命令.
2) vim hello.c
2.1 GCC编译流程
对hello.c的编译过程进行拆解:
1) 预处理为.i文件
gcc -E hello.c -o hello.i
2) 编译成汇编程序.s
[b]gcc -S hello.i -o hello.s[/b]
[b] 3) 将汇编文件通过汇编编译成为二进制文件.o[/b]
[b] gcc -C hello.s -o hello.o[/b]
[b] 4) 最后将二进制文件链接成可执行程序[/b]
[b] gcc hello.o -o hello[/b]
[b] 注意执行gcc hello.o -o hello 时,会出现如下问题:[/b]
[b]
[/b]
原因在第3步时,汇编hello.s汇编成二进制hello.o时main函数冲突造成的
解决办法使用如下命令进行汇编:
将第3步改为 as hello.s -o hello.o
其它的一样.
为什么用as呢?
as命令GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。
来自: http://man.linuxde.net/as
具体问题请看大神解析点击打开链接
[b]2.1.1 gcc基本规则[/b]
gcc所遵循的部分约定规则:
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;
.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;
.m为后缀的文件,是Objective-C源代码文件;
.mm为后缀的文件是Objective-C++源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
2.2 gcc 编译选项
1)程序优化
[b]
[/b]
[b]
[/b]
[b] 2)产生调试工具[/b]
[b]
[/b]
[b] 3)头文件路径寻找[/b]
[b]
[/b]
[b] gcc -I /myroot hello.c -o hello[/b]
[b]4)错误信息[/b]
[b]
[/b]
[b]5)宏[/b]
[b]
[/b]
例如:
程序中将define注释掉
正常情况下是不会运行printf的,因为程序中没有定义宏PRINT. 如下:
在编译时指定使用PRINT宏,则程序会运行printf. 如下
1.1 GCC特点:
1.2 GCC基本用法:
简单测试:
1) touch hello.c
创建一个hello.c文件.
touch命令不过多解释,详情请点击打开链接
也可以直接使用vim创建,此处为了多练习命令.
2) vim hello.c
2.1 GCC编译流程
对hello.c的编译过程进行拆解:
1) 预处理为.i文件
gcc -E hello.c -o hello.i
2) 编译成汇编程序.s
[b]gcc -S hello.i -o hello.s[/b]
[b] 3) 将汇编文件通过汇编编译成为二进制文件.o[/b]
[b] gcc -C hello.s -o hello.o[/b]
[b] 4) 最后将二进制文件链接成可执行程序[/b]
[b] gcc hello.o -o hello[/b]
[b] 注意执行gcc hello.o -o hello 时,会出现如下问题:[/b]
[b]
[/b]
原因在第3步时,汇编hello.s汇编成二进制hello.o时main函数冲突造成的
解决办法使用如下命令进行汇编:
将第3步改为 as hello.s -o hello.o
其它的一样.
为什么用as呢?
as命令GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。
来自: http://man.linuxde.net/as
具体问题请看大神解析点击打开链接
[b]2.1.1 gcc基本规则[/b]
gcc所遵循的部分约定规则:
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;
.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;
.m为后缀的文件,是Objective-C源代码文件;
.mm为后缀的文件是Objective-C++源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
2.2 gcc 编译选项
1)程序优化
[b]
[/b]
[b]
[/b]
[b] 2)产生调试工具[/b]
[b]
[/b]
[b] 3)头文件路径寻找[/b]
[b]
[/b]
[b] gcc -I /myroot hello.c -o hello[/b]
[b]4)错误信息[/b]
[b]
[/b]
[b]5)宏[/b]
[b]
[/b]
例如:
程序中将define注释掉
正常情况下是不会运行printf的,因为程序中没有定义宏PRINT. 如下:
在编译时指定使用PRINT宏,则程序会运行printf. 如下
相关文章推荐
- Vim + Cscope 阅读 Linux kernel
- Linux for github
- Linux 命令记载
- Linux下的快捷技巧大全(ubuntu)
- Linux系统串口接收数据编程
- [转]linux 驱动中insmod与mknod各自的作用
- linux设备模型之kobject
- 高效Linux用户需要了解的命令
- 学习杂记linux
- linux图形界面
- linux hello world2
- linux hello world 1
- 在CentOS6.3上编译安装git 1.8
- linux设备模型(一)
- linux系统中交换区间(swap file)的解释
- CentOS的安装,win7系统的引导恢复
- 12 Linux Which Command, Whatis Command, Whereis Command Examples
- <六> Linux 的文件权限与目录配置
- Linux上的下载软件uGet
- dos系统和unix系统的文件格式区别