CMake中文版是一款功能强大的编译软件。CMake免费版主要是针对于从事编程行业相关人员所打造的,用户可以通过该软件带来一定的便利,给你一个更加舒适安静的编程环境,大大提高了你的编程效率。
CMake绿色版有着极强的兼容性,可以同时输出多样的makefile与project文件,而且操作十分简单,主要是用来构建、测试打包、测试C++特性等等,轻松控制软件进行独立配置,十分方便。
CMake介绍
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的CMake,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的CMake,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
CMake特色
1.开放源代码,使用类 BSD 许可发布。
2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
3.能够管理大型项目,KDE4 就是最好的证明。
4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
5.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来 构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 li^ool。
6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
组态档
组态档是用一种建构CMake专用的特殊编程语言写的CMake脚本。
内建C语言、C++、Fortran、Java的自动相依性分析功能。
经由CMake脚本语言支持SWIG、Qt、FLTK。
内建对微软Visual Studio .NET和过去的Visual Studio版本的支持,可以产生后缀为.dsp、.sln和.vcproj的文档。
用传统的时间标签侦测档案内容的改变。
支持平行建构(在多台电脑上同时建构)
在许多操作系统上进行跨平台编译,包括Linux、POSIX相容的系统(AIX、*BSD、HP-UX、IRIX、MinGW/MSYS、Solaris系统)、Mac OS X和微软Windows 95/98/NT/2000/XP等。
产生可以给Graphviz用的全局相依图。
已经和Dart、CTest和CPack等CMake测试和释出的工具整合。
使用方法
CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。
其基本操作流程为:
$> ccmake directory
$> cmake directory
$> make
其中directory为CMakeList.txt所在目录;
第一条语句用于配置编译选项,如VTK_DIR目录 ,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步才真正派上用场;
第二条命令用于根据CMakeLists.txt生成Makefile文件;
第三条命令用于执行Makefile文件,编译程序,生成可执行文件;
CMake的执行就是这么简单,其难点在于如何编写CMakeLists.txt文件,下面结合例子简单介绍CMakeLists.txt的编写,看下面这个CMakeLists.txt
#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#set extern libraries
SET(LIBRARIES
libm.so
)
#add executable file
ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
#add link library
TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES})
或者用下面这个CMakeLists.txt
#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#add executable file
ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
#add link library
TARGET_LINK_LIBRARIES(../bin/bin m)
这是一个测试数学函数的程序的CMakeLists.txt,"#"后面为注释的内容,CMake的命令全部为大写
第2行指定生成的工程名为test_math
第4行指定头文件目录为include
第8行指定源文件目录为src,并将其赋值给环境变量DIR_SRCS
第10行设定环境变量TEST_MATH的值为环境变量DIR_SRCS的值,此处用于显示如何用环境变量对环境变量进行赋值
第14行将数学函数库赋值给环境变量LIBRARIES,当然,可以不用这个环境变量,而在后面直接使用该库名
第18行用于指定生成文件,将环境变量TEST_MATH目录下的所有文件编译生成../bin目录下的可执行文件bin
第20行指定../bin/bin执行时的链接库为环境变量LIBRARIES的值-libm.so
下面给出源文件
/src/main.c:
#include<stdio.h>
#include"../include/a.h"
int main()
{
double b=25.0;
double a=0.0;
a=get_sqrt(b);
printf("a is %lf, b is %lf\n",a,b);
return 0;
}
/src/a.c
#include"../include/a.h"
double get_sqrt(double var1)
{
return sqrt(var1);
}
/include/a.h
#ifndef A_FILE_HEADER_INC
#define A_FILE_HEADER_INC
#include<math.h>
double get_sqrt(double var1);
#endif
将CMakeLists.txt放在当前目录下,执行CMakeLists.txt
$> cmake .
$> make
即可生成可执行文件,在目录/bin下的bin文件,好了运行看其效果是否和所想一样。
使用教程
配置
从本站下载cmake后,我们可以在下载路径得到一个压缩包,如图所示,解压此压缩包,解压缩有我们可以得到下图所示的文件。下面我们开始配置cmake。
进入电脑属性
在此电脑上右键单击,打开右键菜单,点击属性菜单,如图所示。
进入高级系统设置
在属性页面,我们在左边可以看到高级系统设置选项,如图所示,点击高级系统设置,进入高级系统设置页面。
进入环境变量设置
在高级系统设置页面,可以找到环境变量选项,如图所示,点击环境变量,进入环境变量页面。
进入path变量
在环境变量页面,我们可以看到“系统变量”框,在系统变量部分,我们可以找到path变量,如图所示,双击path变量。打开path变量设置窗口。
设置path变量
打开path变量设置窗口后,将刚才解压的文件所在路径复制,然后点击“新建”,在新的栏目中粘贴路径,点击“确定”即可。
验证配置是否成功
在命令行输入"cmake --version",如果输出如图所示,即配置成功。
编译
运行GUI的cmake界面:
执行Configure:
运行之后,生成了如下文件:
生成Makefile:
执行Generate之后生成如下文件:
运行make进行编译:
编译完成后,在build目录生成Tutorial.exe,运行Tutorial.exe 25就可以看到运行结果:
运行make install安装程序:
运行make test进行测试:
常见问题
CMake缓存是什么?
用户在第一次运行CMakeCMake时,它会生成一个CMakeCache.txt文件。此文件包含诸如本机JPEG库的存在和位置之类的内容。
添加条目以响应某些CMake命令(例如FIND_LIBRARY),因为它们在源树中的所有地方在CMakeLists文件中的所有地方处理。
在CMake运行后,并创建了一个CMakeCache.txt文件 - 你可以编辑它。CMake GUI,将允许您轻松地编辑选项,或者您可以直接编辑文件。
编辑缓存的主要原因是给予CMake本地库(如JPEG)的位置,或者阻止它使用本地库并在源代码树中使用库的版本。
CMake不能改变缓存文件本身中的现有条目。如果您的CMakeLists.txt文件变化显着,您将需要从缓存文件中删除相关条目。如果你还没有手动编辑缓存文件,你可以删除它,而后重新运行CMake。
cmake如何处理路径包含头文件?
CMake中,添加头文件路径,对应的函数叫includ。然后在参数中,把所有需要添加的路径,加进去就可以了。
添加库路径,对应的函数叫LINK_DIR,同样,在参数中,把所有的路径加进去就可以了。
CMake中的函数调用,是不区分大小写的,大小写可以混合使用。
添加库,对应的函数叫LINK_LIBR,把所有的库加进去即可。这
里有一个注意事项,这个不需要我们手动添加.lib这个后缀了,挺方便的。
然后执行CMake,生成内容。然后这里需要切换到Rele版本,进行编译。生成成功并运行。
查看之所以Debug版本编译有问题,发现依赖库为osg.lib而不是osgd.lib,也就是说依赖库是Rele版的。
为何要使用项目构建工具?
为何要使用cmake和autotools之类的项目构建工具? 我想,这恐怕是刚刚接触CMake项目的人最应该问的问题之一了。
“Hello, world!“这个最经典的程序相信我们每个人都写过。无论在什么平台下,编译和运行这个程序都仅需要非常简单的操作。但事实上,hello,world最多只能算是一个实例程序,根本算不上一个真正的CMake项目。
任何一个CMake项目,除了写代码之外,还有一个更为重要的任务,就是如何组织和管理这些代码,使项目代码层次结构清晰易读,这对以后的维护工作大有裨益。使想一下,如果把一个像KDE4那么大的项目像hello world那样,把全部代码都放到一个main.cpp文件中,那将会是多么恐怖的一件事情。别说KDE4,就是我们随便一个几千行代码的小项目,也不会有人干这种蠢事。
决定代码的组织方式及其编译方式,也是程序设计的一部分。因此,我们需要cmake和autotools这样的工具来帮助我们构建并维护项目代码。
看到这里,也许你会想到makefile,makefile不就是管理代码自动化编译的工具吗?为什么还要用别的构建工具?
其实,cmake和autotools正是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。如果你自己动手写过makefile,你会发现,makefile通常依赖于你当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。因此,对于大多数项目,应当考虑使用更自动化一些的cmake或者autotools来生成makefile,而不是上来就动手编写。