Linux C语言编程环境
- 编辑器
vim,vi - 编译链接器
gcc编译器
编译过程,包括词法,语法,语义分析,中间代码生成,优化,符号表的管理和出错处理等等。 - 调试器
gdb调试器,设置断点,单步跟踪等 - 项目管理器
make,控制编译,自动管理软件编译的内容,方式和时机
gcc编译器
gcc意思GNU C Compiler。
gcc除了支持C语言外,还支持Ada语言,C++语言,Java语言,PASCAL语言。
- 预编译(pre-processing)
- 编译(compiling)
- 汇编(assembling)
- 链接(linkling)
后缀名 | 所对应的语言 | 编译流程 |
---|---|---|
.c | C原始程序 | 预处理,编译,汇编 |
.cpp /.cc | C++原始程序 | 预处理,编译,汇编 |
.m | Objective 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>
即可。