【UNIX_Linux环境高级编程】Linux初入门之基础理论相关

本文介绍了Linux系统的基础理论,包括其开源性质、象征性企鹅标志,以及MINIX和GNU社区的相关知识。接着,讨论了GNU编译器框架及其在不同语言和平台上的应用。此外,还详细阐述了编译过程,文件后缀的意义,以及在编译多个文件时需要注意的问题,如头文件的使用和预处理指令。最后,提到了环境变量在头文件路径设置中的作用和头文件的三种定位方式。
摘要由CSDN通过智能技术生成

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 既不用修改代码也不会造成冲突,但使用时麻烦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值