一、UNIX系统介绍
诞生于1971年美国AT&T公司的贝尔实验室,主要开发者是丹尼斯.里奇、肯.汤普逊。
该系统的主要特点是支持多用户、多任务,并支持多种处理器架构,同时具有高安全性、高可靠性、高稳定性,既可以构建大型关键业务系统的商业服务器,也可以构建面向移动终端、手持设备、可穿戴设备的嵌入式应用。
二、Linux系统介绍
是一款类UNIX系统,免费开源,不同的发行版使用相同的内核,一般用在手机、平板、路由器、台式计算机、大型计算机、超级计算机,从严格意义上来说,Linux仅指的是操作系统内核,隶属于GNU工程,发明人叫 Linus Benedict Torvalds,1991年第一次公开在校内网的FTP服务器上。
Linux系统的Logo:
是一只企鹅,是南极的标志性动物,而目前南极不属于任何国家,为全人类所共有的,而Linux用它来当操作系统就意味这款系统属于全人类。
Minix操作系统:
荷兰的Andrew S. Tanenbaum教授所开发的一款不包含任何UNIX源码的类UNIX系统,Linus Torvalds深受Minix的启发写出了第一版本的Linux内核。
GNU工程:
发起于1984年,由自由软件基金会提供支持,它基本原则就是共享,目的是发展出一个免费且开源的类UNIX系统,名称来自GNU's Not UNIX!的递归缩写,因为GNU的设计类似UNIX,但它不包含具著作权的Unix代码。GNU的创始人,理查德·马修·斯托曼,将GNU视为“达成社会目的技术方法”。
GNU的发展仍未完成,其中最大的问题是具有完备功能的内核尚未被开发成功。GNU的内核,称为Hurd,但是其发展尚未成熟。在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux。
POSIX标准:
可移植操作系统接口(Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。
Linux完全遵循了这个标准,所以两个操作系统的API,名字相同、参数相同、返回值相同,在Linux下编写的代码,经过稍微修改可移植到UNIX上。
GPL通用公共许可证:
GNU通用公共许可证简称为GPL,是由自由软件基金会发行的用于计算机软件的协议证书,使用该证书的软件被称为自由软件。允许对某成果及其派生成果的重用、修改和复制,对所有人都是自由的,但不能声明做了原始工作,或声明由他人所做。
Linux发行版:
Linux只是内核,内核+Shell+基础软件才是可用的操作系统。
其它公司可以根据Linux内核制作出不同版的Linux系统。
ubuntu、redhat、CentOS、debian、UOS
三、GNU编译工具
是GNU组织为了编译Linux内核源码而开发的一款编译工具,经过长时间的发展目前已经成为一个编译平台,能够支持多种编程语言、能够在主流操作系统中使用,编译C代码的工具gcc,编译C++代码的工具g++
通过 工具名 -v 参看编译工具的版本信息
gcc常用的编译参数:
gcc [选项参数] 文件
-E # 预处理
-S # 生成汇编文件
-c # 生成目标文件
-o # 设置编译结果的名字 -ohehe == -o hehe
-I # 指定要导入的头文件的路径 -I /path
-l # 指定要导入的库文件 例如:-lm导入数据库
-L # 指定要链接的共享库的路径
-D # 编译时定义宏 -D宏名
-g # 编译时添加调试信息,这样的编译结果可以通过gdb调试
-Wall # 尽可能多的产生警告,编译器更严格地检查代码
-Werror # 把警告当做错误处理
-std # 指定编译器遵循的语法标准 gnu89\gnu99\gnu11
-pendantic # 对一些不符合ANSI\ 标准的代码、扩展代码会产生警告
# case a ... b:
gcc相关的文件类型:
xxx.c # 源文件
xxx.h # 头文件
xxx.i # 预处理文件
xxx.s # 汇编文件
xxx.o # 目标文件
xxx.h.gch # 头文件的编译结果,用于检查头文件语法,必须立即删除
libxxx.a # 静态库文件 Windows中以.lib结尾
libxxx.so # 动态库文件\共享库文件 Windows中以 .dll结尾
gcc把C语言变成可执行程序的过程:
# 1、预处理
gcc -E xxx.c #把预处理结果显示到屏幕上
gcc -E xxx.c -o xxx.i #生成.i结尾的预处理文件
# 2、把预处理文件 编译成汇编文件
gcc -S xxx.i #生成.s结尾的汇编文件
# 3、把汇编文件翻译成二进制的目标文件
gcc -c xxx.s #生成.o结尾的目标文件
# 4、把若干个目标文件、库文件合并生成可执行文件
gcc a.o b.o c.o ... #默认生成a.out可执行文件
gcc支持的预处理指令:
#include
#define
#undef
#if
#elif
#ifdef
#ifndef
#endif
#wanring # 在预处理时产生警告信息
#error # 在预处理时产生错误,并阻止可执行文件生成
#line # 指定行数
#pragma pack(1\2\4\8) # 设置按1\2\4\8字节数进行内存对齐、补齐
#pragma once # 相当于头文件卫士
#pragma GCC posion <标识符> # 禁用标识符
#pragma GCC dependency "文件名" # 能够监控文件 如果该文件比本文件更新则产生警告
gcc预定义的宏:
int main(int argc,const char* argv[])
{
printf("%s\n",__FILE__); //获取当前文件名
printf("%s\n",__func__); //获取当前函数名
printf("%s\n",__FUNCTION__); //获取当前函数名
printf("%d\n",__LINE__); //获取行数
printf("%s\n",__DATE__); //获取日期
printf("%s\n",__TIME__); //获取时间
}