zoukankan      html  css  js  c++  java
  • 十七、程序包管理之yum和编译安装

    YUM

        Redhat二次发行版 Yellow Dog Linux,上使用的yum(Yellowdog Update Modifier),由yellow dog 研发

     yum命令的工作原理

      1、接收用户命令

      2、yum扮演为客户端,请求启用的仓库(yum.repos.d/*.repo)中URL对应的文件服务器,下载元数据(repodata),保存至缓存中。

      3、yum命令分析元数据,找出将要安装的程序包所依赖的程序包且在系统中没有安装的程序包列表,并向文件服务器请求下载程序包,保存至缓存中。

      4、根据缓存中的程序包,先安装被依赖的程序包。

      5、安装后,删除程序包,保留元数据。

    yum repository: yum repo

      存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)

      1、接收命令

      2、请求下载repodata目录中元数据校验码:repomd.xml文件

      3、比对repomd.xml

      相同:用本地的元数据

      不相同:重复首次安装过程


      一、Yum作用

      1、rpm前端管理工具,自动解决程序包安装/卸载时的依赖关系。

      2、C/S架构:C:yum程序所在的电脑,S:文件服务器

      3、基于插件,提供众多功能,工作机制或设计体系存在问题,安装过程中半道中止时,下次重启yum命令不能够解决。

      4、dnf命令能够解决Yum命令存在的问题,使用方法基本同yum

     5、yum支持proxy,color,ssl

    二、配置文件

    ini风格: [] 表示一个配置段

    获取帮助:

    man的章节: 1: 普通用户 8:管理员 2:syscall 3:libcall 4:设备 5:配置文件 6:game 7:杂项

    1)查看帮助手册所有的章节: whatis yum

    2)查看帮助: man 5 yum.conf

    获取配置文件

    rpm -qc yum

      yum.conf         ## 为所有仓库提供公共配置

      yum.repos.d/*.conf  ## 为仓库的指向提供配置

    配置文件格式 

    yum.conf
    [main]      表示主配置段
    cachedir    缓存文件的位置(程序包+元数据信息)
        
    $$basearch # cpu架构,X86_64等
         $releasever # 系统版本
    keepcache 缓存使用后是否保留 1保留 0删除 debuglevel 调试级别 logfile yum安装程序包的安装日志文件路径 exactarch 是否精确平台匹配 1是 0否 (当前rhl6,程序包rhl7能否安装?) obsolutes 是否废弃 gpgcheck 安装包时是否检查来源合法性及完整性 1检查 (yum --nogpgcheck本次不检查) plugins 是否支持插件机制 1支持 (yum --noplugins 本次关闭) installonly_limit 同时安装几个程序包 bugtrack_url 追踪bug的URL distroverpkg 发行版 版本号 获取位置: centos / redhat 
    debuglevel  调试级别
    logfile     yum安装程序包的安装日志文件路径
    exactarch   是否精确平台匹配   1是   0否 (当前rhl6,程序包rhl7能否安装?)
    obsolutes   是否废弃
    gpgcheck    安装包时是否检查来源合法性及完整性 1检查 (yum --nogpgcheck本次不检查)
    plugins     是否支持插件机制   1支持   (yum --noplugins 本次关闭)
    installonly_limit  同时安装几个程序包
    bugtrack_url 追踪bug的URL
    distroverpkg 发行版 版本号 获取位置: centos / redhat


    仓库定义
    [repositoryid] 仓库ID:多个仓库ID不能相同:base表示安装光盘提供的基本安装树 name= 仓库的名字 fail over method={roundrobin|priority} 故障转移方法 默认为roundrobin: 随机,priority: 从上而下 baseurl=URL repodata目录所在的目录:是仓库指向的路径 URL ... enabled={1|0} 默认启用 gpgcheck={1|0} gpgkey=URL 指向能访问密钥文件的访问路径 repo_gpgcheck={1|0} 是否检查元数据信息repodata enablegroups={1|0} 默认启用,是否支持在此仓库上使用组批量管理程序包 cost= 设定开销:默认1000 keepalive 远程为http1.1时,是否使用保持连接 bandwidth 带宽 username 用户名 password 密码

    用URL定义仓库指向,baseurl=URL

    URL: schema://服务器IP或域名/URL路径(指向一个文件或目录文件)

    URL schema: ftp:// http:// https://  nfs:// file:///

     三、yum命令

    获取帮助: man yum

    获取子命令的帮助:yum help [SUB_COMMAND]

    3.1、yum [OPTIONS...] [SUB_COMMAND] 

    OPTIONS

        -y  交互式询问,自动回答为yes

        -q  静默模式,grep , xz , zip,不显示程序包的依赖信息

        --nogpgcheck      禁用 GPG 签名检查,不检查完整性和来源合法性

        --disablerepo=REPO  仓库中如果enabled=1,本次安装忽略由REPO指定的仓库

        --enablerepo=REPO   仓库中如果enabled=0,本次安装启用由REPO指定的仓库

        --noplugins       本次安装禁用所有插件

    注:yum -y -q :需要分开写

      yum不允许同时在多个终端同时安装

    使用示例
    -y
    1、不加-y 
    [root@localhost ~]# yum install zsh
    总下载量:2.4 M
    安装大小:5.6 M
    Is this ok [y/d/N]:  将交互式的显示是否安装
    2、加-y
    [root@localhost ~]# yum install -y zsh
    总下载量:2.4 M
    安装大小:5.6 M
    Downloading packages:
    
    -q
    1、不加
    [root@localhost~]# yum remove zsh
    已加载插件:fastestmirror
    正在解决依赖关系
    --> 正在检查事务
    ---> 软件包 zsh.x86_64.0.5.0.2-25.el7 将被 删除
    --> 解决依赖关系完成
    [root@izpo45bh60h6bsz ~]# yum -q remove zsh
    
    ========================================================================================
     Package         架构               版本                        源                 大小
    ========================================================================================
    正在删除:
     zsh             x86_64             5.0.2-25.el7                @base             5.6 M
    
    事务概要
    ========================================================================================
    移除  1 软件包
    
    是否继续?[y/N]:
    依赖关系解决
    2、加
    [root@localhost ~]# yum -q remove zsh
    
    ========================================================================================
     Package         架构               版本                        源                 大小
    ========================================================================================
    正在删除:
     zsh             x86_64             5.0.2-25.el7                @base             5.6 M
    
    事务概要
    ========================================================================================
    移除  1 软件包
    
    是否继续?[y/N]:
    
    --disablerepo=REPO
    [root@localhost ~]# yum repolist
    已加载插件:fastestmirror
    Loading mirror speeds from cached hostfile
     * epel: mirrors.neusoft.edu.cn
    源标识                 源名称                                                     状态
    base                   CentOS-7 - Base - mirrors.aliyun.com                        9,363
    epel/x86_64            Extra Packages for Enterprise Linux 7 - x86_64             11,769
    repolist: 21,132
    [root@localhost ~]# yum --disablerepo=base repolist
    已加载插件:fastestmirror
    Loading mirror speeds from cached hostfile
     * epel: mirrors.neusoft.edu.cn
    源标识                 源名称                                                     状态
    epel/x86_64            Extra Packages for Enterprise Linux 7 - x86_64             11,769
    repolist: 11,769
    
    --enablerepo=REPO
    [root@localhost ~]# yum --enablerepo=extras repolist
    已加载插件:fastestmirror
    Loading mirror speeds from cached hostfile
     * epel: mirrors.neusoft.edu.cn
     * extras: mirrors.aliyun.com
    源标识                    源名称                                                  状态
    base                      CentOS-7 - Base - mirrors.aliyun.com                     9,363
    epel/x86_64               Extra Packages for Enterprise Linux 7 - x86_64          11,769
    !extras/7/x86_64          CentOS-7 - Extras - mirrors.aliyun.com                     449
    repolist: 21,581
    
    --noplugins
    1、加载插件
    [root@localhost ~]# yum install zsh-4.3.11-4.el6.centos.2.i686.rpm 
    已加载插件:fastestmirror
    
    2、不加载插件
    [root@localhost ~]# yum --noplugins install zsh-4.3.11-4.el6.centos.2.i686.rpm 
    正在检查 zsh-4.3.11-4.el6.centos.2.i686.rpm: zsh-4.3.11-4.el6.centos.2.i686
     

    3.2、SUB_COMMAND

    安装:install,localinstall,groupinstall

        install package ...

        localinstall package ... (centos 5安装rpm必须)

        groupinstall GROUP ...

       1、直接给出: yum install gcc  默认安装最新

       2、给出版本: yum install gcc-1.2.3 指定安装版本

    3.3、查询:list/repolist grouplist info whatprovides

    显示仓库列表:

        repolist [all|enables|disabled]

      仓库信息:安装、可用

           repolist [all|enabled|disabled] 默认为enabled(启用和禁用)

    显示程序包:

            显示: yum  list [all|available|installed|updates]  [glob_expr1] ...

            搜索:search STRING ... (STRING由Glob通配符和纯文本字符组成)

            查看指定CAPABILITY(文件/功能)由哪个程序包所提供

                whatprovides CAPABILITY

        包内

            信息: info package ...

    yum repolist 显示启用 仓库id 仓库name 程序包的数量
    yum list  包名 release号 仓库id
    yum search yum 搜索程序包及简要信息
    yum whatprovides /bin/ls  显示功能或文件由哪个仓库或程序包来提供
    yum info 报名 :  类似rpm -q -i 显示程序包的内容
    Name        : yum
    Arch        : noarch
    Version     : 3.4.3
    Release     : 150.el7.centos
    Size        : 5.5 M
    Repo        : installed
    From repo   : base
    Summary     : RPM package installer/updater/manager
    URL         : http://yum.baseurl.org/
    License     : GPLv2+
    Description
     
     
    
    卸载: remove,groupremove
    
        remove package ...
    
        groupremove GROUP ...
    
    [root@localhost ~]# yum remove yum
     

     3.4、常用命令

    yum install  PACKAGES    # yum安装程序包
    yum reinstall package1 [package2] [...]  # 重新安装
    yum remove  PACKAGES   # yum卸载程序包
    yum remove | erase package1 [package2] [...]
    
    yum repolist  # 可查看搭建的yum库有多少个安装包。
    yum repolist all # 显示所有的仓库情况
    yum clean # 清除yum缓存 cat /var/log/yum.log # 查看yum安装报的日志文件,包括安装、卸载、更新等 yum list # 显示所有库中所有的包,前带@说明已经安装 yum list *ftp* # 支持文件名通配符,列出包含ftp的程序包 yum list [all | glob_exp1] [glob_exp2] [...] # 列出包,支持文件名通配符 yum list {available|installed|updates} [glob_exp1] # 列出可用的、可安装的、能升级的 yum update [package1] [package2] [...] # 升级,一般不建议升级 yum downgrade package1 [package2] [...] # 降级 yum check-update # 检查可用升级
      
    1、检查可用升级[root@izpo45bh60h6bsz ~]# yum --enablerepo=updates check-update
      2、升级:[root@izpo45bh60h6bsz ~]# yum --enablerepo=updates update
    yum info [...] # 查询包信息 

    yum provides | whatprovides feature1 [feature2] # 查看指定的特性(可以是某文件)是由哪个程序包所提供

    yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] # 清除/var/cache/yum/$basearch/$releasever缓存,清楚类型指定,all为所有

    yum
    makecache # 构建缓存

    yum
    search string1 [string2] [...] # 以指定的关键字搜索程序包名及summary信息

    yum deplist package1 [package2] [...] # 查看指定包所依赖的capabilities

    3.5、本地缓存

        清理: clean [headers|packages|metadata|dbcache|plugins|expire-cache|all]

        构建: makecache

    1、清理程序包
    yum clean packages
    2、清理头文件
    yum clean headers
    3、清理元数据
    yum clean metadata
    4、清理插件
    yum clean plugins
    5、清理过期缓存
    yum clean expire-cache
    6、清理所有
    yum clean all
    
    7、构建缓存
    yum makecache

     3.6、查看yum历史事务:

      历史: history [info|list|packages-list|summary|addon-info|redo|undo|rollback|new]

    yum history   # 查看历史记录
    yum history info 6  # 查看yum历史记录第六条的详细信息  
    yum history undo 6  # 反向操作yum历史记录第六条的操作
    [root@localhost ~]# yum history  #### 相当于yum history list
    Loaded plugins: fastestmirror
    ID     | Command line             | Date and time    | Action(s)      | Altered
    -------------------------------------------------------------------------------
       104 | install zsh-4.3.11-4.el6 | 2017-08-16 18:44 | Install        |    1   
       103 | remove zsh               | 2017-08-16 18:44 | Erase          |    1   
       102 | -y reinstall zsh-5.0.2-2 | 2017-08-16 18:24 | Reinstall      |    1   
       101 | install zsh-5.0.2-25.el7 | 2017-08-16 18:22 | Install        |    1   
       100 | --nogpgcheck remove zsh  | 2017-08-16 18:18 | Erase          |    1   
        99 | install --nogpgcheck zsh | 2017-08-16 18:17 | Install        |    1   
        98 | remove --nogpgcheck zsh  | 2017-08-16 18:16 | Erase          |    1   
        97 | install zsh-4.3.11-4.el6 | 2017-08-16 18:15 | Install        |    1   
        96 | remove zsh               | 2017-08-16 18:14 | Erase          |    1   
        95 | --nogpgcheck install zsh | 2017-08-16 18:13 | Install        |    1   
        94 | remove zsh               | 2017-08-16 18:13 | Erase          |    1   
        93 | install zsh-4.3.11-4.el6 | 2017-08-16 18:12 | Install        |    6  <
        92 | install -y zsh           | 2017-08-16 18:08 | Install        |    1 ><
        91 | install createrepo       | 2017-08-16 10:01 | Install        |   56 ><
        90 | install zsh              | 2017-08-15 11:58 | Install        |   40 ><
        89 | install zsh-4.3.11-4.el6 | 2017-08-15 11:05 | Install        |    2 > 
        88 | install mdadm            | 2017-08-11 17:14 | Install        |    2   
        87 | install tigervnc-server  | 2017-07-31 22:24 | Install        |   22 P<
        86 | install libtermcap-devel | 2017-07-31 15:54 | Install        |    1 ><
        85 | -y install sendmail mail | 2017-07-31 15:49 | Install        |    4 > 
    Warning: RPMDB altered outside of yum.
    history list
    
    [root@localhost ~]# yum history summary
    Loaded plugins: fastestmirror
    Login user                 | Time                | Action(s)        | Altered 
    -------------------------------------------------------------------------------
    root <root>                | Last day            | E, I, R          |       74
    root <root>                | Last week           | Install          |       44
    root <root>                | Last 3 months       | E, I, U          |      469
    System <unset>             | Last 6 months       | I, U             |      288
    root <root>                | Last 6 months       | I, U             |      206
    history summary
    
    [root@localhost ~]# yum history info
    Loaded plugins: fastestmirror
    Transaction ID : 104
    Begin time     : Wed Aug 16 18:44:57 2017
    Begin rpmdb    : 100:e66a5c3b4265234fa222836dc108212efe773c48
    End time       :            18:44:58 2017 (1 seconds)
    End rpmdb      : 101:d0ae5b619911556d572b14f912f0be9bdd0a9ba7 **
    User           : root <root>
    Return-Code    : Success
    Command Line   : install zsh-4.3.11-4.el6.centos.2.i686.rpm
    Transaction performed with:
        Installed     rpm-4.11.3-21.el7.x86_64                      @base
        Installed     yum-3.4.3-150.el7.centos.noarch               @base
        Installed     yum-plugin-fastestmirror-1.1.31-40.el7.noarch @base
    Packages Altered:
        Install zsh-4.3.11-4.el6.centos.2.i686 @/zsh-4.3.11-4.el6.centos.2.i686
    history info

    3.7、利用yum安装包组

    yum groupinstall group1 [group2] [...]
    yum groupupdate group1 [group2] [...]
    yum grouplist [hidden] [groupwildcard] [...]
    yum groupremove group1 [group2] [...]
    yum groupinfo group1 [...]
    
    yum grouplist  # 查看包组列表

    3.8、版本: version

    [root@locahost ~]# yum version  ##rpmdb的版本
    Loaded plugins: fastestmirror
    Warning: RPMDB altered outside of yum.
    Installed: 7/x86_64                         101:db92c5ee1a848d4268e09e1b87f10e6808a76af1
    Group-Installed: yum                         15:396f07de8170b01350e3ca880e428c054b68573d
    version

    如何使用光盘当作本地yum仓库

     1)、挂载光盘

      挂载光盘至某目录,例如/media/cdrom

      #mount -r -t iso9660 /dev/cdrom  /media/cdrom

      2)、创建配置文件

    yum的repo配置文件中可用的变量:

       $releasever: 当前OS的发行版的主版本号
    
        $arch: 平台
    
        $basearch: 基础平台(x86平台,统一识别为i386)
    
        $YUM0-YUM9 自定义变量
    比如:
    实例:(针对不同版本的系统)
    http://mirrors.magedu.com/centos/$releasever/$basearch/os
    http://server/centos/7/x86_64
    http://server/centos/6/i384

    对于repo文件我们也可以参考阿里云,
    http://mirrors.aliyun.com/repo/
    将其的配置格式直接作为我们自己的配置。
    可通过:
    wget url....下载配置文件至当前目录




    cd /etc/yum.repos.d/

    mv CentOS-Base.repo CentOS-Base.repo_bak

    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.rep

    yum clean all

    yum makecache

    开销:服务器距离主机的距离,网络的延迟

    镜像:同类仓库出现多个时,yum基于插件,同一个仓库指向一堆服务。不同站点同时提供同类仓库

    程序包选择:

       1、多个版本时,安装新的版本。

       2、多个镜像站点,有相同的程序包,选择cost低的服务器

    yum仓库配置及生成

    仓库配置

      1)、挂载光盘

      挂载光盘至某目录 

     2)、配置仓库 

     yum -y install createrepo

    仓库的生成 

       抽取rpm包中元数据(rpm内部文件的清单,CAPABILITY信息),制作repodata文件,放在repodata文件中及元数据的特征码。用createrepo命令实现

    createrepo命令

    createrepo [OPTIONS...] DIR
    -o DIR          将repodata目录输出至
    -x rpmfile ...  将目录中的rpm包排除
    -i rpmfile ...  只对目录中的rpm包生成元数据及特殊码
    --basedir=DIR
    
    # createrepo -o /tmp /root
      /tmp/repodata
    repomd.xml 存放元数据的指纹信息

        元数据的存储的位置

        压缩后存储于文件

        sqllite接口存储,便于查询

    1、清空目录
    [root@localhost ~]# ls /tmp
    [root@localhost ~]# 
    
    2、创建元数据
    [root@localhost ~]# createrepo -o /tmp /root
    Spawning worker 0 with 5 pkgs
    Workers Finished
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    lSqlite DBs complete
    
    3、查看元数据位置
    [root@localhost ~]# ls  /tmp
    repodata
    
    4、查看元数据的组成
    [root@localhost ~]# ls /tmp/repodata/
    24bff8236c43b8cce77ca9809b2b1e88bfd1e8fdfd74aef81ca79f93581ca228-primary.xml.gz
    2f2effdd5cfd0a15456308e7f519c71981c5b6b0a022f1e727c753fd9d0b9257-filelists.sqlite.bz2
    511b71f4b3d7d7a45a0578ca8e9afd8afaaed9ec6bc807245b47a70c3d0f02b1-other.sqlite.bz2
    6fdabd5af8661afc931075fde9bc87f1859f78819fae135832918a2548ed7c9b-other.xml.gz
    9c564d97a9a0ecd0b8d244b14c9cc22fffb62279989b041e66c8a2df1551c730-primary.sqlite.bz2
    b0ab6c6ab987d2d530ca3faf2c7c3b725375a156df2130e77ccbc911b1ecc752-filelists.xml.gz
    repomd.xml  ##以上数据的校验码信息

    lftp命令

    lftp> !STRING 执行shell命令
    lftp> lcd DIR 本地执行切换目录
    lftp> mget file ... 批量下载文件

    程序包编译安装

        目的:

       1、提供的rpm功能不全

       2、新功能,rpm包还没有制作

         原理: 源代码 -- 预处理(预处理器) -- 编译(编译器gcc) -- 汇编代码 -- 汇编(汇编器) -- 二进制指令 -- 链接(链接器)

      源代码命名:

      testapp-1.2.3-1.操作系统平台.src.rpm -----》安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装

      编译: 

         静态: 共享库编译进程序,运行时不调用共享库,不链接,占内存。

         共享库:在编译成二进制程序后,需要用链接器,链接库。运行时,调用共享库。节约内存。

    源代码组织格式:

      多文件:文件中的代码之间,很可能存在跨文件依赖关系:

        为了简化难度提供项目管理工具

             java源程序: maven

             c,c++程序: make (configure----->Makefile.in(开发工具生成)----->makefile)

    C,C++代码编译的步骤

    1、获取程序包开源代码的途径

      1)、官方自建的站点

         apache.org(ASF:Apache Software Fundition)

         mariadb.org

      2)、代码托管站点

         SourceForge

         Github.com

         code.google.com

    2、

        1)、手动提供开发环境及工具

            开发工具 :make 、gcc

                autoconf 生成confiugre脚本

                automake 生成Makefile.in文件

               建议:安装前查看INSTALL 、README (/usr/share/doc/* )

            开发环境:开发库,头文件

                glibc(Gnu C标准库)、头文件

        

        2)、通过“包组”提供开发组件 :

      CentOS包组 :可使用yum  grouplist 查看

            6 "Development Tools" "Server Platform Development"      

         yum -y groupinstall "Server Platform Development" :安装包组以后不需要自己解决依赖环境 或者自己安装软件时自己解决依赖也可以

            7 "Development Tools"

    3、展开查看INSTALL,README帮助手册:获取安装方式

        1)只需要make

        2)只需要make install

        3) 直接使用

    4、安装后检验gcc是否安装完毕: gcc --version

    5、编译

       5.1、 获取编译可指定的选项:  ./configure --help

          1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.ini文件生成makefile;

       2)检查依赖到的外部环境;

        --prefix=DIR         程序默认安装位置,便于卸载(只有此选项时,所有其他目录均在DIR目录下)
    
        --sysconfdir=CONF_DIR   配置文件安装
    
        --disable-FATURE      默认启用,不想用时,才禁用
    
        --enable-FATURE     默认禁用,想用时,才启用
    
        --with-PACKAGE=PATH    指定当前程序包依赖的包及其所在的路径
    
        --without-PACKAGE    指定当前程序包不依赖的包
    

    5.2 、make          当./configure成功后,生成Makefile文件后,方可make

       根据makefile文件,构建应用程序

          **注意Make后error信息**

    5.3、make install     调用install命令,完成复制文件(dd,cp,install)

       一些脚本,就是把构建出来的应用程序,二进制扔到所指定的二进制路径里面去,库文件扔到所指定的库文件里面去

    6、编译后的处理

        PATH变量输出、库路径输出、头文件路径输出、man手册路径输出 

    1)导出二进制程序目录至PATH环境变量

        环境变量: profile类

      编辑文件/etc/profile.d/NAME.sh

        export  PATH=/PATH/TO/BIN:$PATH

            全局: /etc/profile 、 /etc/profile.d/*.sh

            个人: ~/.bash_profile

    2)导出库文件路径

        查看库: ldconfig -p

         编辑库文件: /etc/ld.so.conf 、 /etc/ld.so.conf.d/*.conf

           添加新的库文件所在目录至此文件中

      让系统重新生成缓存: ldconfig [-v]

    查看程序依赖的库:

        # ldd path

    3)导出头文件

      基于链接的方式实现:

          ln -sv /path/to/include /usr/include/NAME

    4)导出帮助手册 

     编辑/etc/man.config文件

        添加:MANPATH /PATH/TO/man

        不导出时:

            man -M /PATH/TO/man COMMAND

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11374043.html
Copyright © 2011-2022 走看看