在最近的学习中了解到一些开源算法库,也由此摸索出了一些开源库编译的基本方法:
CMake是一个开源的,跨平台的用于构建,测试和打包软件的工具集。CMake在简单的平台上使用独立于编译器的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用的本机makefile和工作空间。CMake工具套件是由Kitware创建的,以满足开源项目(如ITK和VTK)强大的跨平台构建环境的需求。 ——[Cmake官方网站]
这是一段摘自Cmake官方网站的介绍,按照我们中国人的说法来说可能略显晦涩,但是不得不说这段定义相当的准确和严谨,完全概括了该工具集的定位。(下面这一段是针对刚刚入门的小白的,大神估计不会看这么肤浅的东西,哈哈)我简单做一个解释:
首先
root@ubuntu:/usr/opensource/BUILD/Eigenbuild/doc/examples# class_Block
4 0 0
0 4 0
Now the matrix m is:
5 0 0 0
0 5 0 0
0 0 1 0
0 0 0 1
这一段是一个简单的控制台程序对吧,虽然是在linux系统下的显示,但是大多数windows的朋友们还是见过这个黑框框的吧。微软的产品用户体验做得非常平易近人,比如Windows OS和Visual Studio 。然而要进军于程序开发,就要了解一些关于计算机软硬件方面的原理性知识,知道一个程序是如何编译出来的,最原始的命令是什么,才能了解计算机到底做了什么,而不仅仅是照着书本依葫芦画瓢。所以,少年,放弃那些炫酷易用的GUI来进入黑框框的世界吧!闲话扯远了,回归主题,那如何编译出这样的程序呢。其实这些大家或多或少也接触过,不信你看:
make all
Building file: ../src/HelloWord.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/HelloWord.d" -MT"src/HelloWord.o" -o "src/HelloWord.o" "../src/HelloWord.cpp"
Finished building: ../src/HelloWord.cpp
Building target: HelloWord
Invoking: GCC C++ Linker
g++ -o "HelloWord" ./src/HelloWord.o
Finished building target: HelloWord
19:59:11 Build Finished (took 662ms)
这是在eclipse-CDT下构建HelloWorld
程序的控制台输出,注意这里“构建”这个两个字非常重要,“构建”英文对应于“Build”,而不是”编译”对应的“Compile”。在软件项目中的构建工作在广义上包含了项目软件在应用过程中的所有指令。
上图是geo库的构建指令,这里仅作例证。我们使用“Build Project”命令来构建工程,默认的目标(Targets)是all,这才是编译所有二进制可执行文件。如果我们build其他target,比如check,就是检查第一build all的编译结果是否完整。
然而讲这个有什么用呢,很简单,当你在helloworld里构建了一个build选项的时候,你会发现文件目录下多了一个Makefile,在这个Makefile目录下输入命令
~/CodeWorkspace/HelloWord/Debug# make
控制台打印出:
make: 'src/HelloWord.o' is up to date.
中间文件就被编译出来了。关于make和makefile命令的文章请参考例解Linux 下 Make 命令 - hazir - 博客园。这篇文章讲得很好,虽然是linux系统下的,但windows下的vs构建项目也是同样的道理。由此,也就是说make
命令读取的是Makefile文件,再根据Makefile的内容执行命令,而Makefile文件的内容也就是构建命令却需要根据平台和编译器而变化,一些必须的和可选的组件设置也不同,难道开源库的作者必须为各种情况写Makefile吗?
答案不言而喻。由此,cmake应运而生,它的目的就是根据用户计算机的各种情况生成专门的Makefile,之后就可以简单地使用make
命令来构建项目了。
这里我拿一个例子来说吧,开源库CGAL(The Computational Geometry Algorithms Library)是一个提供高效并且可靠的几何算法的C语言软件库,对于解决各种几何问题有帮助。下面来构建这个库吧。
首先,当然是下载开源库。下载完成以后解压应差该如下:
打开文件夹中的README也可以查看目录下各个文件的功能
README
-------------------------------------------------------------------------------
This distribution of CGAL includes:
AUTHORS - current and former authors of CGAL
CGAL的贡献作者
CHANGES - history of changes for the library
该库的历史修改
CMakeLists.txt - main script of the build system
构建系统的主要脚本
INSTALL.md - information about the installation process
有关安装过程的信息
LICENSE - describes the license of CGAL
关于CGAL的许可的描述
LICENSE.FREE_USE - text of the free use license (see LICENSE file)
自由许可的内容
LICENSE.GPL - text of GPL v3 license
GPLv3许可的内容
LICENSE.LGPL - text of LGPL v3 license
LGPLv3许可的内容
README - this file
本文件
VERSION - version number of this release
发布版本
auxiliary/ - directory containing miscellaneous things, currently only
the icons needed for the demos on MacOS X
一些杂物
cmake/ - some scripts needed by the build system
构建系统所需的一些脚本
config/ - some test programs used during the configuration process
设置过程中的一些测试程序
demo/ - many demo programs for the library's various packages.
本库中各种包的一些演示
These programs produce visual output (see INSTALL for
prerequisites).
这些程序产生可视化的输出
doc_html/ - documentation, e.g. the CGAL Installation Guide
文档,比如CGAL的安装引导
examples/ - programs illustrating the library's functionality.
These programs do not produce visual output.
说明本库功能的程序,这些程序不产生可视化的输出
include/ - the include files for the CGAL library (and other small
external libraries as well, see the LICENSE file)
CGAL库的包含文件和一些小的外部库,请参阅许可文件
scripts/ - some useful scripts for CGAL programmers
一些CGAL程序员的脚本
src/ - the source code for building the CGAL libraries
(as well as some external libraries, see the LICENSE file)
构建CGAL库的源文件,还有一些外部库,请参阅许可文件
-------------------------------------------------------------------------------
所以接下来看INSTALL.md,这里对如何安装该库就介绍得比较清晰了:挑重点的翻译一下,先决条件:
为了安装CGAL,你需要cmake和一些第三方库,其中有一些第三方库是必须的对所有包都有效,一些是可选的对部分包有效,还有一些仅对示例程序有效。
看来要求了不少开源包呢,是不是望而生畏呢?简单试试吧~
cmake可以在软件中心下载到、boost可以通过新立得软件管理包下载到,QT5到官网下载安装都是自动的,接下来GPM和MPFR下载好,解压打开INSTALL,看看要求怎么安装。
GPM的文件夹下打开终端,依次输入:
./configure
make
make check <= VERY IMPORTANT!!
make install
同理MPFR
./configure
make
make check <= VERY IMPORTANT!!
make install
其实这也是两个开源库,我们刚刚就构建完成了他们。
Eigen库也是按照说明:
cd build_dir
cmake source_dir
make install
其实这里已经算是使用了cmake命令了,这里的build-dir和source-dir都需要根据具体情况换成用户的文件夹。构建完成以后可以在/usr/local/include中看到eigen3的文件夹。
NTL库打开doc文件夹下的tour.html页面,找到使用的平台安装帮助,可以得到在ntl文件夹下输入如下的命令:
cd ntl-xxx/src
./configure
make
make check
make install
其实到这里差不多大家也看明白了,就是根据需要搜集各个库,然后按照提示一步一步来就可以了。其他的库就不演示了,回到CGAL的构建:
使用cmake对构建系统进行调整,这里推荐不太习惯命令行的朋友们使用cmake-gui这个工具,比较直观。
cmake-gui
设置好资源文件和目标文件夹路径,注意,目标文件夹不是编译出来的文件要放在的位置,而是生成的makefile的位置。第一次configure应该如下:
这些红色的地方就是检测出来可以调整的选项,检查并且根据需要调整。调整完以后再点一次configure,如下:
上面的选项就变成白色了,这时候就可以选择generate了,这里的生成器(generator选择依据平台而定),本机可选的生成器会出现在选择界面里,也可以通过命令行查看:
当生成完成后,切换到刚才生成的makefile文件夹里,在终端里输入
make
make install
接下来就可以在usr/local/include里看到CGAL的头文件,在usr/local/lib里看到CGAL的库文件了:
这些开源库是由别人编写的,所以如何构建它必须参照别人给出的提示,这一般在其官方网站和下载文件夹中都有。一些不依赖于第三方库的库如eigen只需要简单make再install一下就可以了,而其他依赖于第三方库的库如cgal就需要先用cmake设置本库的构建选项,生成专门的makefile,然后再依据这些makefile进行make、install。简单画了一个图,便于理解: