Linux初入门之基础理论相关
Linux系统介绍
简介
Linux是一款类UNIX的操作系统(在全世界程序员的努力下一起开发出来的,发起者是林纳克斯.托瓦斯),开源免费,准确来Linux是一个操作的内核,而不是一个完整的操作系统。
标志
它的标志是一只小企鹅,因为企鹅是南极洲的标志性动物,根据国际公约,南极洲归全人类共同所有,不属于任何国家,这也意味着Linux是开源的,为全人类共同所有,任何公司无权将其私有。(感觉这个蛮有意思的)
相关知识
MINIX是一种基于微内核架构的类UNIX计算机操作系统,由Andrew S. Tanenbaum发明。MINIX最初发布于1987年,开放全部源代码给大学教学和研究工作。
GNU社区,GNU是“GNU is Not Unix”的递归缩写,它的基本原则就是共享,目标是发展出一个有别有商业UNIX的系统。目前是世界最大的开源社区,Linux内核归这个社区维护,Linux也叫GNU Linux。
POSIX标准(Portable Operating System Interface of UNIX)统一的系统编程接口规范,而UNIX和Linux都遵循了这个规则,所以它们的代码基本上是可以通过。
GPL通用许可证书,允许对某些成果及派生出的成果进行重用、修改和复制,对所以有人都是自由的,但不能声明做了原始工作,或声明有他人所做,不能营利。
GNU编译器框架
前期是GNU社区为了编译Linux源码而开发的一款编译器(gcc、g++),然后逐渐演变成一套编译框架,现在支持的编程语言有:C、C++、Objective-C、Java、Ada,支持所有的平台:Linux、Windows、MacOS
编译器(build)过程
编辑->预处理->编译->汇编->链接
1、编辑:vim code.c -> code.c
2、预处理:gcc -E code.c -o code.i -> code.i
3、编译:gcc -S code.i -> code.s
3、汇编:gcc -c code.s -> code.o
4、链接:gcc code1.o code2.o … -> a.out
gcc -v 可以查看版本信息。
文件的后缀
.h C源代码的头文件
.c 预处理前的C源文件
.i 预处理后的C源文件
.s 编译后的汇编文件
.o 汇编后的目标文件(二进制的elf格式的)
.a 静态库文件
.so 共享库(动态库)文件
编译多个文件时要注意的问题
当多个文件编程时,如果函数调用者不知道函数长什么样子(函数没有声明),编译器会猜测函数的格式(返回值int,参数会根据调用都提供的实参猜测),如果猜测正确则代码正常运行,如果猜测失败则会出错,而预防这种问题最好的方法就是添加头文件进行说明。
头文件中写什么
1、声明外部变量、函数,对应的.c中有什么全局变量、函数。
2、宏定义、类型别名、自定义类型(结构、联合、枚举等)。
3、包含其它头文件。
4、头文件卫士(防止头文件被重复引用面引发错误)。
包含头文件时要注意的问题
gcc -I 指定加载头文件的路径
#include <…>
先从-I指定的路径加载头文件,如果没有再去系统指定的路径下加载头文件。
#include “…”
先从-I指定的路径加载头文件,如果没有再去当前路径下加载,如果还没有再去系统指定的路径加载。
编译中有哪些预处理指令
#include
#include <> 从系统指定的路径下加载头文件,系统指定的路径有:/usr/include、/usr/local/include、/usr/lib/gcc/i686-gnu/4.6.3/include/
#include “” 先从当前路径下加载头文件,如果没有再从系统指定的路径下加载头文件
#define 定义宏、宏常量、宏函数
#undef 删除宏
#if
#else
#elif
#endif 与if分支有关的
#ifdef 宏存在时为真
#ifndef 宏不存在时为真
#把标识符转换成字符串字面值
##合并两个标识符
#error 编译时产生错误
#warning 编译时产生警告
#line 指定行号
#pragma GCC dependency <文件名>
监控文件的变化
#pragma GCC poison <标识>
禁止使用某些标识符,例如:goto
#pragma pack() 修改结构、联合中的对齐、补齐的字节数。
只能从默认往小改,超出默认值无效,必须是2的小次方。
环境变量
系统可以通过设置环境变量的文件来指定头文件的加载路径。
C_INCLUDE_PATH 指定C头文件的加载路径,跟gcc -I功能一样,一但配置好永久有效。
CPATH 同上
LIBRARY_PATH 指定编译时加载共享库、静态库的路径
LD_LIBRARY_PATH 指定共享库运行时的加载路径
头文件的三种定位方式
1、#include “目录/xx.h” 直接把头文件的路径写入在字符串中,但如如果头文件的位置发生改变,需要修改代码。
2、通过设置:C_PTHAT、C_INCLUDE_PATH环境变量,如果同时构建多个项目时可能会造成冲突,但好处时一次配置,长期有效。
3、编译时添加参数:gcc code.c -I path 既不用修改代码也不会造成冲突,但使用时麻烦。