UNIX-Linux环境编程(一):开发环境

一、Unix操作系统

1. 简介

美国AT&T公司贝尔实验室1971年肯.汤普逊丹尼斯.里奇
PDP-11,多用户、多任务、支持多种处理器架构,高安全性、高可靠性,高稳定性。
既可构建大型关键业务系统的商业服务器应用,也可构建面向移动终端、手持设备等的嵌入式应用。
在这里插入图片描述

2. 三大派生版本

1) System V

AIX: IBM,银行
Solaris: SUN->Oracle,电信
HP-UX
IRIX

2) Berkley

FreeBSD
NetBSD
OpenBSD
Mac OS X

3) Hybrid

Minix: 迷你版的类Unix操作系统。
Linux: GPL,免费开源,商用服务器(RedHat)、
桌面(Ubuntu)、嵌入式(Android)。

3. Unix族谱

在这里插入图片描述

二、Linux操作系统

1. 简介

类Unix操作系统免费开源,不同发行版本使用相同内核。
手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型计算机、超级计算机。
严格意义上的Linux仅指操作系统内核,隶属于GNU工程,发明人Linus Torvalds。
在这里插入图片描述

2. 标志

Tux (Tuxedo,一只企鹅)企鹅是南极洲的标志性动物,根据国际公约,南极洲为全人类共同所有。
不属于当今世界上的任何国家,当今任何国家无权将南极洲纳入其版图。
Linux选择企鹅图案作标志,其含意也是表明:开源的Linux,为全人类共同所有,任何公司无权将其私有。
在这里插入图片描述

3. 相关知识

1) Minix操作系统

荷兰阿姆斯特丹Vrije大学,数学与计算机科学系,
Andrew S. Tanenbaum,ACM和IEEE的资深会员。

2) GNU工程

Richard Stallman发起于1984年,由自由软件基金会(FSF)提供支持。
GNU的基本原则就是共享,其主旨在于发展一个有别于一切商业Unix系统的。
免费且完整的类Unix系统——GNU Not Unix。

3) POSIX标准

Portable Operating System Interface forComputing Systems,统一的系统编程接口规范
由IEEE和ISO/IEC开发,保证应用程序源代码级的可移植性Linux完全遵循POSIX标准

4) GPL通用公共许可证

允许对某成果及其派生成果的重用、修改和复制,对所有人都是自由的,但不能声明做了原始工作,或声明由他人所做。

  1. 版本
  1. 早期版本:0.01, 0.02, …, 0.99, 1.0

  2. 旧计划:介于1.0和2.6之间,A.B.C
    •A: 主版本号,内核大幅更新。
    •B: 次版本号,内核重大修改,奇数测试版,偶数稳定版。
    •C: 补丁序号,内核轻微修订。

  3. 2003年12月发布2.6.0以后:缩短发布周期,A.B.C-D.E
    •D: 构建次数,反映极微小的更新。
    •E: 描述信息。
    rc/r - 候选版本,其后的数字表示第几个候选版本,
    越大越接近正式版本
    smp - 对称多处理器
    pp - Red Hat Linux的测试版本
    EL - Red Hat Linux的企业版本
    mm - 测试新技术或新功能
    fc - Red Hat Linux的Fedora Core版本

5) 特点

•1) 遵循GNU/GPL
•2) 开放性
•3) 多用户
•4) 多任务
•5) 设备独立性
•6) 丰富的网络功能
•7) 可靠的系统安全
•8) 良好的可移植性

6) 发行版本

•1) 大众的Ubuntu
•2) 优雅的Linux Mint
•3) 锐意的Fedora
•4) 华丽的openSUSE
•5) 自由的Debian
•6) 简洁的Slackware
•7) 老牌的RedHat

三、GNU编译工具GCC

1. 支持多种编程语言

C、C++、Objective-C、Java、Fortran、Pascal、Ada

2. 支持多种平台

Unix、Linux、Windows

3. 构建(Build)过程

编辑 -> 预编译 -> 编译 -> 汇编 -> 链接
•1) 编辑: vi hello.c -> hello.c
•2) 预编译:gcc -E hello.c -o hello.i -> hello.i -+
•3) 编译: gcc -S hello.i -> hello.s | GCC
•4) 汇编: gcc -c hello.s -> hello.o | 工具链
•5) 链接: gcc hello.o -o hello -> hello -+

范例:hello.c
1.#include <stdio.h>
2.
3.int main ()
4.{
5. printf(“Hello, World !\n”);
6. return 0;
7.}

4. 查看版本

gcc -v

5. 文件后缀

1…h - C语言源代码头文件
2…c - 预处理前的C语言源代码文件
3…i - 预处理后的C语言源代码文件
4…s - 汇编语言文件
5…o - 目标文件
6…a - 静态库文件
7…so - 共享库(动态库)文件

6. 编译单个源程序

1.gcc [选项参数] 文件
2.-c - 只编译不链接
3.-o - 指定输出文件
4.-E - 预编译
5.-S - 产生汇编文件
6.-pedantic - 对不符合ANSI/ISO C语言标准的
7. 扩展语法产生警告
8.-Wall - 产生尽可能多的警告。
9. 范例:gcc -Wall wall.c
10.-Werror - 将警告作为错误处理。
11. 范例:gcc -Werror werror.c
12.-x - 指定源代码的语言。
13. 范例:gcc -x c++ cpp.c -lstdc++
14.-g - 生成调试信息
15.-O1/O2/O3 - 优化等级

7. 编译多个源程序

gcc [选项参数] 文件1 文件2 …

•头文件的作用是什么
◦1) 声明外部变量、函数和类。
◦2) 定义宏、类型别名和自定义类型。
◦3) 包含其它头文件。
◦4) 借助头文件卫士,防止因同一个头文件被多次包含,而引发重定义错。

•包含头文件时需要注意的问题
◦1) gcc的-I选项
指定头文件附加搜索路径。
◦2) #include <…>
先找-I指定的目录,再找系统目录。
◦3) #include “…”
先找-I指定的目录,再找当前目录,最后找系统目录。
◦4) 头文件的系统目录
/usr/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6.3/include
/usr/include/c++/4.6.3 (C++编译器优先查找此目录)

范例:calc.h、calc.c、math.c

calc.h

#ifndef _CALC_H
#define _CALC_H

double add (double, double);

#endif // _CALC_H

calc.c

#include "calc.h"

double add (double a, double b) 
{
    return a + b;
}

math.c

#include <stdio.h>
#include "calc.h"
//不包含calc.h,输出0.000000,参数和返回值均按int处理。
//包含calc.h,输出30.000000,参数和返回值均按double处理。
int main (void) 
{
    printf ("%lf\n", add (10, 20));
    return 0;
}

8. 预处理指令

1.#include // 将指定文件的内容插至此指令处
2.#include_next // 与#include一样,但从当前目录之后的目录查找,极少用
3.#define // 定义宏
4.#undef // 删除宏
5.#if // 判定
6.#ifdef // 判定宏是否已定义
7.#ifndef // 判定宏是否未定义
8.#else // 与#if、#ifdef、#ifndef结合使用
9.#elif // else if多选分支
10.#endif // 结束判定
11.## // 连接宏内两个连续的字符串
12.# // 将宏参数扩展成字符串字面值
13.#error // 产生错误,结束预处理
14.#warning // 产生警告
15.#pragma // 提供额外信息的标准方法,可用于指定平台
16.#pragma GCC dependency <文件> // 若<文件>比此文件新则产生警告
17.#pragma GCC poison <标识> // 若出现<标识>则产生错误
18.#pragma pack(1/2/4/8) // 按1/2/4/8字节对齐补齐
19.#line // 指定行号

范例:error.c、line.c、pragma.c
error.c

#include <stdio.h>

#if (VERSION < 3)
    #error "Version too low !"
#elif (VERSION > 3)
    #warning "Version too high !"
#endif

int main (void) 
{
    printf ("VERSION=%d\n", VERSION);
    return 0;
}
# gcc error.c -DVERSION=2
error.c:4:3: error: #error "Version too low !"
# gcc error.c -DVERSION=3
# gcc error.c -DVERSION=4
error.c:6:3: warning: #warning "Version too high !" [-Wcpp]

line.c

#include <stdio.h>

int main (void) 
{
    printf ("%d\n", __LINE__);
#line 100
    printf ("%d\n", __LINE__);
    return 0;
}

pragma.c

#include <stdio.h>

#pragma GCC dependency "dep.c" // 若dep.c比此文件新则产生警告
#pragma GCC poison goto float  // 若出现goto或float则产生错误

int main (void) 
{
    //goto escape;
    //float f;
#pragma pack(1)
    struct S1 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCIIIIHH, 15
#pragma pack()
    struct S2 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCXXXIIIIHHXX, 20
#pragma pack(8)
    struct S3 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCXXXIIIIHHXX, 20
#pragma pack()
    printf ("S1: %u字节\n", sizeof (struct S1));
    printf ("S2: %u字节\n", sizeof (struct S2));
    printf ("S3: %u字节\n", sizeof (struct S3));
    return 0;
escape:
    printf ("goto到第%d行!\n", __LINE__);
    return 0;
}

9. 预定义宏

BASE_FILE // 正在编译的源文件名
FILE // 所在文件名
LINE // 行号
FUNCTION // 函数名
func // 同__FUNCTION__
DATE // 日期
TIME // 时间
INCLUDE_LEVEL // 包含层数,从0开始
cplusplus // C++编译器将其定义为1,
// C编译器不定义该宏

范例:print.h、predef.h、predef.c
print.h

#ifndef _PRINT_H
#define _PRINT_H

#include <stdio.h>

void print (void) 
{
    printf ("__BASE_FILE__     : %s\n", __BASE_FILE__);
    printf ("__FILE__          : %s\n", __FILE__);
    printf ("__LINE__          : %d\n", __LINE__);
    printf ("__FUNCTION__      : %s\n", __FUNCTION__);
    printf ("__func__          : %s\n", __func__);
    printf ("__DATE__          : %s\n", __DATE__);
    printf ("__TIME__          : %s\n", __TIME__);
    printf ("__INCLUDE_LEVEL__ : %d\n", __INCLUDE_LEVEL__);
#ifdef __cplusplus
    printf ("__cplusplus       : %d\n", __cplusplus);
#endif // __cplusplus
}
#endif // _PRINT_H

predef.h

#ifndef _PREDEF_H
#define _PREDEF_H

#include "print.h"

#endif//_PREDEF_H

predef.c

#include "predef.h"

int main (void) 
{
    print ();
    return 0;
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/perror_0/article/details/106791940