您的位置:首页 > 运维架构 > Linux

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. 如下








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: