Linux,gcc编译器

Linux C语言编程环境

  • 编辑器
    vim,vi
  • 编译链接器
    gcc编译器
    编译过程,包括词法,语法,语义分析,中间代码生成,优化,符号表的管理和出错处理等等。
  • 调试器
    gdb调试器,设置断点,单步跟踪等
  • 项目管理器
    make,控制编译,自动管理软件编译的内容,方式和时机

gcc编译器

gcc意思GNU C Compiler。
gcc除了支持C语言外,还支持Ada语言,C++语言,Java语言,PASCAL语言。

  1. 预编译(pre-processing)
  2. 编译(compiling)
  3. 汇编(assembling)
  4. 链接(linkling)
后缀名所对应的语言编译流程
.cC原始程序预处理,编译,汇编
.cpp /.ccC++原始程序预处理,编译,汇编
.mObjective C原始程序预处理,编译,汇编
.i预处理过的C原始程序编译,汇编
.ii预处理过的C++原始程序编译,汇编
.s/.S汇编语言原始程序汇编
.h预处理文件不出现在gcc的指令行
.o目标文件链接
.a/.so编译后的库文件链接

gcc基本语法

gcc [option|filename]

预处理

gcc -E -o [目标文件] [编译文件]

有两个文件:

/*hello.h*/
#ifndef _HELLO_H_
#define _HELLO_H_
typedef unsigned int u32;
#endif
/*hello.c*/
#include <stdio.h>
int main()
{
	u32 i=0;
	printf("hello,%d\n",i);
}

示范指令如下所示:

gcc -E -o hello.i hello.o

"-E"可以使编译器在预处理结束时就停止编译,编译到预处理阶段
"-o"指定gcc输出结果
“hello.i”,使经过预处理的C原始程序。
编译后得到的"hello.i"文件内容如下:

/*hello.i*/
#2 "hello.c" 2
#1 "hello.1" 1
typedef unsigned int u32;
#3 "hello.c" 2
int main()
{
	u32 i=0;
	printf("hello,%d\n",i);
}

预处理得到的"hello.i"文件,就是把"hello.h"的内容插入到"hello.i"文件中。
编译阶段

gcc -S -o [目标文件] [编译文件]

检查代码的规范性,是否有语法错误,确定代码实际要做的工作,检查无误后,将代码翻译成汇编语言。

gcc -S -o hello.s hello.i

“-S” 编译器编译到编译阶段就停止

汇编阶段

gcc -c -o hello.o hello.s

将".s"文件生成目标文件".o"文件。
链接阶段

gcc -o hello hello.o

程序中没有定义printf函数实现,在预编译中包含进"stdio.h",gcc会到系统默认的搜索路劲"/usr/lib"下进行查找,链接到"llibc.so.6"函数库

gcc指令作用

指令意思
-Wall输出警告信息
-o指定文件名
-E编译到预处理阶段
-S编译到编译阶段
-c编译到汇编阶段
-static静态链接
-I指定头文件搜索路径
-L指定库搜索路径

库函数

系统可用库,安装在"/usr/lib"和"/lib"目录下。
系统头文件,在"/usr/include"目录下。
静态链接库
后缀名为".a"

gcc mian.c -L /root/workplace/gcc -o mian

动态链接库(共享库)
后缀名为".so"
数学共享库文件名是libm.so.5,很容易看出,把库文件名的头lib和尾.so去掉就是库名,库名是m,版本号为5。
"m"是标识字符,

例子:

gcc -o hello hello.c   -I/home/hello/include   -L/home/hello/lib    -lworld

-I/home/hello/include,表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include => /usr/include => /usr/local/include
也就是指定优先查找的目录,找不到的话查找默认目录。

-L/home/hello/lib,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib=>/lib=>/usr/lib=>/usr/local/lib

就是指定优先查找的目录,找不到的话查找默认目录。
-lword, 表示寻找动态链接库文件 libword.so(也就是文件名去掉前缀和后缀所代表的库文件)

如果想链接同名的静态链接库,在"-l"之前添加选项"-static"。例如,链接"libm.a":

gcc -o hello hello.c -static -lm

#include<my_main.h>语句中,“<>“表示在标准路径中搜索头文件,在Linux中默认为”/usr/include”.
如果编译的头文件和c文件在同一个目录下,只需要#include<my_main.h>即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值