1.Unix和linux系统的简介
1.1 Unix系统的简介
在1969年左右,编写操作系统使用的是汇编语言,无论是编写还是维护都非常不方便,贝尔实验室中的肯-汤普逊在很多语言的基础上研发了B语言,后来贝尔实验室中的丹尼斯-里奇在B语言的基础上做了修改和扩展,改名为New B语言,后来改名为C语言;
C语言诞生于1972年,至今在编程语言排行榜上依然占据重要地位;
Unix系统诞生于1970年,具有支持多用户、多任务以及多种处理器的特点;
1.2 linux系统的简介
linux系统是一款自由免费开放源代码的类Unix系统;
当前教学环境: ubuntu 12.04版本 32位的操作系统
每半年发布一个新版本,分别是4月和10月
2.gcc编译器的使用
2.1 基本概念
gcc的原名叫做 GNU C Compiler(编译器),支持对C语言的编译,后来对该编译器做了扩展,支持了更多语言的编译,如C++等,于是改名为GNU Compiler Collection(集合);
2.2 基本功能(理解)
目前主流的开发都是用高级语言(C,C++,java等),高级语言编写的代码是无法被计算机执行,此时需要先将高级语言代码翻译成汇编语言,然后再将汇编语言翻译成机器指令,最后通过链接生成最后的可执行文件,此时该可执行文件可以被计算机执行;
gcc编译器主要用于实现上述过程,通过编译链接来生成最终的可执行文件,具体过程分为以下4步:
(1)预处理/预编译
- 主要用于实现头文件的扩展以及宏替换等;
(2)编译
- 主要用于将高级语言代码翻译成汇编语言,得到汇编文件
(3)汇编
- 主要用于将汇编语言翻译成机器指令,得到目标文件
(4)链接
- 主要用于将目标文件和库文件链接,生成可执行文件
2.3 常用的编译选项
(1)要求掌握的选项
gcc/cc -E 预编译,缺省输出到屏幕,使用-o选项来指定输出文件(.i文件)
gcc/cc -S 编译,将高级语言文件翻译成汇编语言文件(.s文件)
gcc/cc -c 汇编,将汇编语言文件汇编成机器语言文件(.o文件)
gcc/cc -o 指定输出文件名
gcc/cc xxx.c 编译 + 链接,默认生成a.out
(2)要求熟悉的选项
gcc/cc -std 用于指定C语言的执行标准
gcc/cc -v 用于查看gcc的版本信息
gcc/cc -Wall 用于尽可能显示所有警告信息
gcc/cc -Werror 用于将警告当作错误处理
(3)了解的选项
gcc/cc -g 用于生成调试信息,可以进行gdb调试;
gcc/cc -x 显式指定源代码的编程语言;
gcc/cc -O 用于进行优化处理;
(4)扩展的选项
man gcc/cc 查询有关gcc的详细信息
2.4 编程相关的常用文件后缀
.h - 头文件 .c - 源文件
.i - 预处理文件 .s - 汇编文件
.o - 目标文件
.a - 静态库文件 .so - 共享库文件
3.多文件结构的编程
3.1 多文件结构的主要组成
.h - 头文件,主要存放函数声明、结构体定义等;
.c - 源文件,主要存放函数定义、变量的定义等;
.a - 静态库文件,主要实现对功能模块的打包等;
.so - 共享库文件,主要实现对功能模块的打包等;
... ...
3.2 头文件的详细组成(重中之重)
(1)头文件卫士
#ifndef ....
#define ....
#endif
(2)包含其他头文件
#include <stdio.h>
... ...
(3)进行宏定义
#define PI 3.14
... ...
(4)结构体的定义以及对数据类型起别名
struct node
{
int data;//记录数据元素
struct node* next;//记录下一个节点的地址
};
typedef struct node Node;
(5)外部变量和函数的声明
extern int num;
void show(void);
如:
a.c文件: #include "a.h"
void show(void){}
b.c文件: #include "a.h"
void show(void){}
cc a.i b.i => 重定义的错误
注意:
变量和函数的定义不要写在头文件中,因为一个头文件可能会被多个源文件包含,
写在头文件中的定义也会因此被预处理器扩展到多个包含该头文件的源文件中,
并且在编译阶段被编译到多个不同的目标文件中,这将直接引发重定义的链接错误;