自己编译软件
理想情况下,大部分软件应该由root账户用包管理器安装在系统公共shell配置文件设定的环境变量中(一般是/etc/bashrc, /etc/bash_profile中所指定的$PATH,$LD_LIBRARY_PATH等),比如Python3、R 4.x、高版本的GLIBC库等。当然以考古著称的CentOS,情况并不理想。
又因为不会为module安装新的软件,所以很多时候,同学们需要自行安装一些软件在自己的用户目录下。一般正规的软件会以两种方式发布,一种是需要用户自行编译的源代码(source code),一种是已经由作者编译好可以直接运行的二进制程序(precompiled)。这里说的软件都是指由C/C++等编译型语言编写的程序,没有依赖模块/包的Python、Perl、R脚本文件并不属于此,但Python、Perl、R的解释器属于此讨论范围。
由作者编译好的二进制程序,往往采用动态编译的方式,运行时需要能在环境变量中找到各种动态库文件(像是类似于glibc 2.27 not found in /usr/lib64/libc.so.6这样的东西)。至于静态编译,可以参考手机上的App,体积巨大、自带运行环境、互相隔离、可独立运行,当然实际上和静态编译并不一样。由于作者们往往使用比较新的开发环境,比如最新的Ubuntu和最新的GCC编译器,经由其动态编译出的二进制程序,无法在古老的CentOS上运行。所以最终,用户有必要自行编译程序在自己的用户目录下。
编译步骤
一般比较规范的软件源代码,已经生成了configure文件在源代码根目录下,运行configure文件就会指定程序将要安装的位置、所使用的编译器、动态库的目录、软件可选功能的开关等等,运行结束后会在源代码根目录下生成makefile文件。makefile文件是make命令的输入文件,能够按照configre命令的配置,执行具体的编译工作,将各种.c的源代码带上参数编译为.o的二进制文件。一般来说configure能正常通过的时候,make也不会有问题,make命令完成编译后,程序已经在源代码目录下生成了可以正常执行的二进制程序,比如会多出一个dist目录,里边存放有/bin, /lib64, /share等。再执行make install命令,会将编译好的程序在一开始configure指定的安装目录下重新组织一份(本质上就是对编译好的文件各种cp与mv)。
以上是规范软件的编译安装流程,即
configure --prefix=XXX --disable-XXX --···
make -j 1/2/4/8/16···
make install
这样的配置(configure)、编译(make)、安装(make install)三步。
常见槽点
- configure时把prefix指定到源代码所在的目录;
- 源代码的压缩包和解压后的目录不删除;
所有支持make install的规范软件,都应该做到源代码和可执行代码分离,源代码解压到任意位置