[Linux]Linux编译安装
通常看到的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.txt和Makefile,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.
也就是说该参数用来指定编译时的线程数目,在尚未指定的时候,默认使用尽可能多的线程。
参考:
给出了四个错误用例,同时给出了正确的版本及其错误原因。涉及Makefile脚本的行与线程的关系,变量引用的差异等。