文章目录
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 编译过程分析
-
./configure
configure
它是个shell
脚本,./configure
那么就是运行这个脚本啦!./configure
是用来检测你的安装平台的目标特征的。比如它会检测你是否有CC
或GCC
。这一步一般用来生成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文件会被重新编译
-
-
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
-
-
make install
就是把编译出来的二进制文件、库、配置文件等等放到相应的目录下
- 安装:上一步的连接是在内存中进行的,即编译器在内存中生成了可执行文件。下一步,必须将可执行文件保存到用户事先指定的安装目录
- 动态链接:正常情况下,到这一步,程序已经可以运行了。至于运行期间(runtime)发生的事情,与编译器一概无关。但是,开发者可以在编译阶段选择可执行 文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。前面已经说过,静态连接就是把外部函数库,拷贝到可执行文件中。这样做的好处是,适用范围比较广,不用担心用户机器缺少某个库文件;缺点是安装包会 比较大,而且多个应用程序之间,无法共享库文件。动态连接的做法正好相反,外部函数库不进入可执行文件,只在运行时动态引用。好处是安装包会比较小,多个应用 程序可以共享库文件;缺点是用户必须事先安装好库文件,而且版本和安装位置都必须符合要求,否则就不能正常运行
2.3 编译过程小结
-
安装gcc,构造编译环境
-
下载源码包
-
解压
-
./configure
-
make
-
make install
-
测试
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等语言的程序,可根据需要选择安装支持的语言。