Linux软件管理之rpm软件组成&编译安装

1 rpm软件组成

使用包管理工具打包成的一个文件.rpm(相当于Windows上的setup或.exe),包括:

1.1 可执行文件(命令)
  • /bin
  • /sbin
  • /usr/bin
  • /usr/sbin
  • /usr/local/bin
  • /usr/local/sbin
1.2 库文件
  • /lib
  • /lib64
  • /usr/lib
  • /usr/local/lib
1.3 配置文件
  • /etc
1.4 其他文件
  • 帮助手册
  • readme
  • 配置案例

2 编译安装

2.1 手动编译与rpm安装的区别
  • rpm功能固定:使用rpm安装会直接使用默认配置安装,如无法指定安装目录等
  • 手动编译功能可选:如指定安装目录、指定安装文件所依赖的库文件等
2.2 编译过程分析

image-20200312152955149.png

  1. ./configure

    configure它是个shell脚本,./configure那么就是运行这个脚本啦!./configure是用来检测你的安装平台的目标特征的。比如它会检测你是否有CCGCC。这一步一般用来生成Makefile,为下一步编译做准备。可以通过在configure后面添加参数来对安装进行控制:例如–prefix=/usr的意思是将软件安装在/usr目录下,执行文件就会安装在/usr/bin(如果不指定,默认的路径是usr/local/bin)。可以通过./configure --help 察看详细的说明帮助

    • 准备软件源码

    • 安装编译工具GCC:

      yum install gcc make
      
    • 配置:通过指定编译参数使编译器灵活适应环境,编译出各种环境都能运行的机器码

      #此操作会生成Makefile
      ./configure --prefix=/usr/local/nginx --with-http_ssl_module
      
    • 确定标准库和头文件的位置:源码肯定会用到标准库函数(standard library)和头文件(header),它们可以存放在系统的任意目录中,编译器实际上没办法自动检测它们的位置,只有通过配置文件才能知道。通过检查系统环境,了解系统标准库在哪里、需要安装什么组件等

    • 确定依赖关系:对于大型项目来说,源码文件之间往往存在依赖关系,编译器需要确定编译的先后顺序。假定A文件依赖于B文件,编译器应该保证做到下面两点

      • 只有在B文件编译完成后,才开始编译A文件
      • 当B文件发生变化时,A文件会被重新编译
  2. make

    make是用来编译的,它从Makefile中读取指令,然后编译。如果在 make 过程中出现 error ,可能是你的系统少了一些依赖库等,这些需要自己仔细研究错误代码

    • 头文件的预编译:不同的源码文件,可能引用同一个头文件(比如stdio.h)。为了节省时间,编译器会在编译源码之前,先编译头文件。这保证了头文件只需编译一次,不必每次用到的时候,都重新编译了

    • 编译:预处理之后,编译器就开始生成机器码。对于某些编译器来说,还存在一个中间步骤,会先把源码转为汇编码(assembly),这种文件称为对象文件object file,然后再把汇编码转为机器码

       .file   "test.c"
          .section    .rodata
      .LC0:
          .string "Hello, world!\n"
          .text
          .globl  main
          .type   main, @function
      main:
      .LFB0:
          .cfi_startproc
          pushq   %rbp
          .cfi_def_cfa_offset 16
          .cfi_offset 6, -16
          movq    %rsp, %rbp
          .cfi_def_cfa_register 6
          movq    stdout(%rip), %rax
          movq    %rax, %rcx
          movl    $14, %edx
          movl    $1, %esi
          movl    $.LC0, %edi
          call    fwrite
          movl    $0, %eax
          popq    %rbp
          .cfi_def_cfa 7, 8
          ret
          .cfi_endproc
      .LFE0:
          .size   main, .-main
          .ident  "GCC: (Debian 4.9.1-19) 4.9.1"
          .section    .note.GNU-stack,"",@progbits
      
    • 链接:编译器的下一步工作,就是把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接linking。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接static linking,还有动态连接dynamic linking

  3. make install

    就是把编译出来的二进制文件、库、配置文件等等放到相应的目录下

    • 安装:上一步的连接是在内存中进行的,即编译器在内存中生成了可执行文件。下一步,必须将可执行文件保存到用户事先指定的安装目录
    • 动态链接:正常情况下,到这一步,程序已经可以运行了。至于运行期间(runtime)发生的事情,与编译器一概无关。但是,开发者可以在编译阶段选择可执行 文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。前面已经说过,静态连接就是把外部函数库,拷贝到可执行文件中。这样做的好处是,适用范围比较广,不用担心用户机器缺少某个库文件;缺点是安装包会 比较大,而且多个应用程序之间,无法共享库文件。动态连接的做法正好相反,外部函数库不进入可执行文件,只在运行时动态引用。好处是安装包会比较小,多个应用 程序可以共享库文件;缺点是用户必须事先安装好库文件,而且版本和安装位置都必须符合要求,否则就不能正常运行
2.3 编译过程小结
  1. 安装gcc,构造编译环境

  2. 下载源码包

  3. 解压

  4. ./configure

  5. make

  6. make install

  7. 测试

2.4 Makefile

Makefile 是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接;但是不是所有的文件都需要重新编译,Makefile能够记录文件的信息,决定在链接的时候需要重新编译哪些文件

2.5 cc和gcc

从名字上看,老的 Unix 系统的 CC 程序叫做 C Compiler 。但 GCC 这个名字按 GNU 的说法叫做 Gnu Compiler Collection ,注意这是一个编译器集合,不仅仅是 c 或 c++。gcc 包含很多编译器(C, C++, Objective-C, Ada, Fortran,and Java) 。所以它们是不一样的,一个是一个古老的 C 编译器,一个是编译器的 Gnu 的编译器的集合(Gcc里的 C 编译器比 CC 强大太多了,所以你没必要用 CC)。

cc 是 gcc 的连接。cc 来自于昂贵的 Unix 系统,cc 是商业软件,gcc 是编译器。

GCC 可以用来编译 C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。

3 RPM

RPM&YUM

4 YUM

RPM&YUM

5 系统实操

系统实操

6 文件压缩/解压

文件压缩/解压

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值