《CMake之初级教程》由会员分享,可在线阅读,更多相关《CMake之初级教程(18页珍藏版)》请在金锄头文库上搜索。
1、CMake 之初级教程(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在 2001 年成为一个独立的开放源代码项目。其*是 www.cmake.org,可以通过访问*来获得更多关于cmake 的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。cmake 的流行离不开 KDE4 的选择。KDE 开发者在使用 autotools 近 10 年之后,终于决定为 KDE4 项目选择一个新的工程构建工具。之所以如此,用 KDE 开发者们自己话来说,就是:只有少数几个“编译专家”能够掌握 KDE 现在的构建体系。在经历了unsermake,scons 以及 cma
2、ke 的选型和尝试之后,KDE4 最终决定使用 cmake 作为自己的构建系统。在迁移过程中,进展一场的顺利,并获得了 cmake 开发者的支持。所以,目前的 KDE4 开发版本已经完全使用 cmake 来进行构建。随着 cmake 在 KDE4 项目中的成功,越来越多的项目正在使用 cmake 作为其构建工具,这也使得 cmake 正在成为一个主流的构建体系。一、为何要使用项目构建工具?为何要使用 cmake 和 autotools 之类的项目构建工具? 我想,这恐怕是刚刚接触软件项目的人最应该问的问题之一了。“Hello, world!“这个最经典的程序相信我们每个人都写过。无论在什么平台
3、下,编译和运行这个程序都仅需要非常简单的操作。但事实上,hello,world 最多只能算是一个实例程序,根本算不上一个真正的软件项目。任何一个软件项目,除了写代码之外,还有一个更为重要的任务,就是如何组织和管理这些代码,使项目代码层次结构清晰易读,这对以后的维护工作大有裨益。使想一下,如果把一个像 KDE4 那么大的项目像 hello world 那样,把全部代码都放到一个 main.cpp文件中,那将会是多么恐怖的一件事情。别说 KDE4,就是我们随便一个几千行代码的小项目,也不会有人干这种蠢事。决定代码的组织方式及其编译方式,也是程序设计的一部分。因此,我们需要 cmake和 autot
4、ools 这样的工具来帮助我们构建并维护项目代码。看到这里,也许你会想到 makefile,makefile 不就是管理代码自动化编译的工具吗?为什么还要用别的构建工具?其实,cmake 和 autotools 正是 makefile 的上层工具,它们的目的正是为了产生可移植的 makefile,并简化自己动手写 makefile 时的巨大工作量。如果你自己动手写过makefile,你会发现,makefile 通常依赖于你当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。因此,对于大多数项目,应当考虑使用更自动化一些的 cmake 或者 autotools
5、来生成 makefile,而不是上来就动手编写。总之,项目构建工具能够帮我们在不同平台上更好地组织和管理我们的代码及其编译过程,这是我们使用它的主要原因。二、cmake 的主要特点:cmake 和 autotools 是不同的项目管理工具,有各自的特点和用户群。存在即为合理,因此我们不会对两者进行优劣比较,这里只给出 cmake 的一些主要特点:1.开放源代码,使用类 BSD 许可发布。2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。3.能够管
6、理大型项目,KDE4 就是最好的证明。4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。5.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来 构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 liool。6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。三、安装 cmake安装 cmake 对任何用户而言都不该再成为一个问题。几乎所有主流的 Linux 发行版的源中都包含有 cmake 的安装包,直接从源中添加即可。当然,也可
7、以在*下载源代码自行编译安装。对于 Windows 和 Mac 用户,cmake 的*上有相应的安装包,下载安装即可,无须赘述。注:为了能够测试本文中的实例程序,如果读者的 Linux 系统中所带的 cmake 版本低于 2.6,请从官网下载 2.6 版本或以上的源代码进行编译并安装。在 linux 下安装 cmake首先下载源码包http:/www.cmake.org/cmake/resources/software.htmlUnix/Linux 用户下载 cmake-2.*.tar.gzWindows 用户的下载文件有 3 种,可任选一种:(1)Windows Source (has rn
8、 line feeds) cmake-2.8.4.zip CMake 的源码文件里面含有测试实例 (2)Windows (Win32 Installer) cmake-2.8.4-win32-x86.exe CMake 的安装文件,直接安装即可(3)Windows ZIP cmake-2.8.4-win32-x86.zip CMake 的绿色版软件,免安装。随便找个目录解压缩tar -xzvf cmake-2.*.tar.gzcd cmake-2.*依次执行:./bootstrapmakemake installcmake 会默认安装在 /usr/local/bin 下面四、从“Hello,
9、world!”开始了解 cmake 的基本原理并在系统中安好 cmake 后,我们就可以用 cmake 来演示那个最经典的”Hello, world!”了。第一步,我们给这个项目起个名字就叫 HELLO 吧。因此,第一部为项目代码建立目录 hello,与此项目有关的所有代码和文档都位于此目录下。第二步,在 hello 目录下建立一个 main.c 文件,其代码如下:#includeint main(void)printf(”Hello,Worldn”);return 0;第三步,在 hello 目录下建立一个新的文件 CMakeLists.txt,它就是 cmake 所处理的“代码“。其实,使
10、用 cmake 管理项目本身也是在编程,所以称之为“代码(或脚本)”并不为过。在 CMakeLists.txt 文件中输入下面的代码(#后面的内容为代码行注释): CMAKE_MINIMUM_REQUIRED(VERSION 2.6) #cmake 最低版本需求,不加入此行会受到警告信息PROJECT(HELLO) #项目名称AUX_SOURCE_DIRECTORY(. SRC_LIST) #把当前目录(.)下所有源代码文件和头文件加入变量 SRC_LISTADD_EXECUTABLE(hello $SRC_LIST) #生成应用程序 hello (在 windows 下会自动生成 hello
11、.exe)至此,整个 hello 项目就已经构建完毕,可以进行编译了。第四步,编译项目。为了使用外部编译方式编译项目,需要先在目录 hello 下新建一个目录 build(也可以是其他任何目录名)。现在,项目整体的目录结构为:hello/| CMakeLists.txt| build / main.c在 windows 下,cmake 提供了图形界面,设定 hello 为 source 目录,build 为二进制目录,然后点击 configure 即可开始构建。编译可以在 VC+2008 下进行,具体见后面的详述。在 linux 命令行下,首先进入目录 build,然后运行命令(注:后面的“.
12、”不可缺少):cmake .该命令使 cmake 检测编译环境,并生成相应的 makefile。接着,运行命令 make 进行编译。编译后,生成的所有中间文件和可执行文件会在 build 目录下。下面是我在ubuntu 上的运行过程:$ lshello$ cd hello/build/$ ls$ cmake . The C compiler identification is GNU The CXX compiler identification is GNU Check for working C compiler: /usr/bin/gcc Check for working C comp
13、iler: /usr/bin/gcc works Detecting C compiler ABI info Detecting C compiler ABI info - done Check for working CXX compiler: /usr/bin/c+ Check for working CXX compiler: /usr/bin/c+ works Detecting CXX compiler ABI info Detecting CXX compiler ABI info - done Configuring done Generating done Build file
14、s have been written to: /home/kermit/Project/cmake/hello/build$ makeScanning dependencies of target hello100% Building C object CMakeFiles/hello.dir/main.c.oLinking C executable hello100% Built target hello$ lsCMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile$ ./helloHello,World上面,我们提到了一个
15、名词,叫外部编译方式。其实,cmake 还可以直接在当前目录进行编译,无须建立 build 目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且 cmake 生成的 makefile 无法跟踪所有的中间文件,即无法使用”make distclean”命令将所有的中间文件删除。因此,我们推荐建立 build 目录进行编译,所有的中间文件都会生成在 build 目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。下面主要介绍在 Windows 平台下 CMake 的编译和最常用的三个命令,分别是cmake_minimum_required; project; add_exe
16、cutable 等。 CMake 是个好东西,在使用 VTK, ITK, IGSTK, OpenCV, DCMTK 等开源工具包时,是离不开 CMake 的,甚至有时你使用 FLTK , Qt 等界面开发工具时,也经常会看到 CMake,你会发现在好多目录下会有一个文件”CMakeLists.txt”,这个文件就是使用 CMake 构建工程环境的重要文件。了解一点关于 CMake 的内容,对使用以上提到的一些开源工具包是灰常有帮助的,而且你会发现,CMake 用久了,你会觉得它是很可爱很好用的东西。废话少说,结合我个人在使用 CMake 的过程中,把 CMake 的一些知识梳理一下,希望对大家有所帮助,如果有不对的地方,请你留言或者发邮件告诉我(水灵,msn: ,QQ: 348774226)。如