Linux环境编程day1

UNIX系统简介:

    1970年于美国贝尔实验室,作者肯.汤普逊和丹尼斯.里奇

    UNIX是最早的多用户、多任务、支持多种CPU架构,高稳定性、高可靠性、高安全性

    既能构建大型关键型业务系统的服务器(银行、电信公司等),也能支持移动嵌入式设备

    Minix是一种开源的基于微内核架构的类UNIX计算机操作系统,Linux之父林纳斯.托瓦兹受到Minix的启发,开发了Linux内核的第一个版本

Linux系统简介:

    Linux,全称 GNU/Linux

    于1991年发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。

    它支持32位和64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。

   

    Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版

    相关知识:

    Linux的标志:企鹅,因为企鹅是南极洲的标志动物,而南极目前没有被任何国家占用,属于全人类

    GNU计划\组织:目前全球最大的开发开源系统的开源组织,负责Linux内核源的升级和维护

    GPL通用许可证:在带有GPL证书的代码基础下开发出来的软件,也都需要支持GPL证书

    POSIX统一可移植操作系统接口:Linux是完全遵循,UNIX绝大部分遵循,所以它们的命令、API接口基本上都是通用的

    发行版:Linux只是内核,内核+Shell+基础软件 = 用户操作系统

        不同的公司可以根据Linux内核制作出不同版本、不同风格的Linux发行版,例如:Ubuntu、Redhat、CentOS、Debian

GNU编译工具gcc\g++:

    多样化:

        支持多种编程语言、支持各种操作系统

        gcc -v 查看版本信息

    编译构建过程:

        预处理:gcc -E code.c -o code.i  //不-o生成文件的话 预处理的结果会显示在终端

        编译:gcc -S code.i     -> code.s

        汇编:gcc -c code.s     -> code.o

        链接:gcc a.o b.o ...   -> a.out  

    文件类型:

        .c          源文件

        .h          头文件

        .h.gch      头文件的编译结果,会被优先使用

        .i          预处理文件

        .s          汇编文件

        .o          目标文件(二进制)

        .a          静态库文件

        .so         共享库文件

    编译参数:

        -E              只预处理

        -S              只生成汇编代码

        -o              指定编译结果文件名

        -c              只编译不链接

        -std            指定语法标准 -std=gnu99

        -g              生成调试信息

        -Wall           尽可能多地产生警告

        -Werror         把警告当错误处理

        -L              指定库文件的查找路径

        -l              指定要一起加载的库文件名字 -lm

        -I              指定头文件的加载路径 <> ""

        -pedantic -ansi  对于不符合ANSI/ISO标准的语法产生警告

    预处理指令:

        #include <>/""  导入头文件

        #define     定义宏常量、函数

        #undef      删除宏

        #ifdef      宏存在则条件为真

        #ifndef     宏不存在则条件为真

        #endif

        #if/#elif/#else/#endif 条件判断编译

        #error 提示错误,并阻止生成可执行文件,一般与条件判断配合

            #error "提示信息"

        #warning 提示警告

        #line 设置行号 影响了提示错误、提示警告的行号

        #pragma pack(n) 设置对齐、补齐的最大字节数

        #pragma once 相当于头文件卫士 防止头文件重复导入

        #pragma GCC dependency "file.h" 监控文件是否有修改

        #pragma GCC poison key 设置关键字key为毒药,禁止在后续代码中使用

   

库:

    库文件是目标文件的集合,可以被其他代码调用,把代码封装成库文件后方便使用、方便管理,安全性高、保密性强

    静态库:

        就是目标文件的集合,当调用静态库时,编译器会把静态库的所有的二进制指令拷贝到最后的可执行文件中

        优点:运行速度比共享库要快,运行时不需要依赖静态库文件

        缺点:可执行文件相对较大,当静态库有修改后,所有使用了该静态库的可执行文件都需要重新编译

    制作静态库:

    1、编译出目标文件

        gcc -c xxx.c ...  

    2、打包目标文件生成静态库文件

        ar -r libxxx.a a.o b.o c.o...

   

    使用静态库:

    1、直接使用

        gcc xxx.c libxxx.a

    2、指定库文件的位置

        gcc xxx.c -Lpath -lxxx

            -L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a .so)

    3、通过修改配置文件中的环境变量来指定库的查找路径

        打开系统配置文件:

            vim ~/.bashrc

        在配置文件末尾添加:

            export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)

        保存退出并重新加载配置文件

            source ~/.bashrc

        使用静态库:

            gcc xxx.c -lxxx

共享库:

        就是带入口的可执行文件,当调用共享库时,调用语句处会记录该函数在共享库中的位置,并且共享库文件要与运行的可执行文件一起加载到内存中,

        当执行到调用共享库代码的语句时,就会跳转到共享库二进制指令的内存中执行,执行完后会跳转回调用语句处

        优点:可执行文件相对较小,当共享库有修改,可执行文件不需要重新编译

        缺点:运行速度比静态库慢一些,运行时需要依赖于共享库文件

    制作共享库:

        1、编译生成目标文件

        gcc -fpic -c xxx.c

            -fpic 生成与位置无关的文件

        2、生成共享库文件

        gcc -shared -fpic a.o b.o c.o ... -o libxxx.so

   

    使用共享库:

    编译时:

    1、直接使用

        gcc xxx.c libxxx.so

    2、指定库文件的位置

        gcc xxx.c -Lpath -lxxx

            -L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a .so)

    3、通过修改配置文件中的环境变量来指定库的查找路径

        打开系统配置文件:

            vim ~/.bashrc

        在配置文件末尾添加:

            export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)

        保存退出并重新加载配置文件

            source ~/.bashrc

        使用共享库:

            gcc xxx.c -lxxx

    动态使用共享库:

        作用:在代码中决定使用哪些共享库,编译时不需要指定,执行时还是需要依赖共享库

        dlopen\dlerror\dlsym

    库文件相关辅助命令:

    ldd 查看可执行文件依赖哪些共享库 ldd ./a.out

    nm 查看目标文件、可执行文件、静态库、共享库文件的符号列表

    strip 减肥 删除目标文件、可执行文件、静态库、共享库文件的符号列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值