通常看到的Linux编译安装过程如下:

./configure --prefix="install path"

如果不指定–prefix,默认安装路径为/usr/local/lib,/usr/local/bin,/usr/local/etc等。./configure是用来检查系统依赖,例如是否安装编译器CC或者GCC,是否有需要的库文件等。

make

make install

make是编译命令,make install是安装命令,其中install并不是make的参数,而是执行Makefile中install后面的语句。回到真实的开源工具xgboost,下载版本为xgboost-0.60,进入文件目录中可以看到文件CMakeLists.txtMakefile,Makefile是CMakeLists.txt的产生文件,工具是cmake,Makefile文件是make的输入。

CMakeLists.txt中的内容主要包括:项目名称,头文件目录,环境变量设置,依赖库设置,生成的文件路径等。

有人描述:Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但不是所有文件都需要重新编译,Makefile能够纪录文件的信息,决定在链接的时候需要重新编译哪些文件。在Unix系统下,Makefile是与make命令配合使用的,有了这个Makefile文件,不论我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件。

从上述描述来看,使用Makefile来实现一种增量编译。如何实现增量?需要全局信息,需要一种能够检测局部更新的工具,而Makefile就是这个工具。

make -j4

此外,在复现源程序的时候,经常会看到make后添加-j4参数,查看帮助:

make -h

得到如下信息:

-j [N], --jobs[=N]        Allow N jobs at once; infinite jobs with no arg.

也就是说该参数用来指定编译时的线程数目,在尚未指定的时候,默认使用尽可能多的线程。

参考:

1.Makefile与Shell的问题

给出了四个错误用例,同时给出了正确的版本及其错误原因。涉及Makefile脚本的行与线程的关系,变量引用的差异等。

2.用户管理和权限控制