首页 > 其他 > 详细

初试cmake

时间:2015-11-26 17:04:21      阅读:345      评论:0      收藏:0      [点我收藏+]

一、cmake简介

1.背景知识

  cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。项目的诞生时间是 2001 年。其官方网站是 www.cmake.org,可以通过访问官方网站获得更多关于 cmake 的信息。cmake的流行其实要归功于 KDE4 的开发(似乎跟当年的 svn 一样,KDE 将代码仓库从 CVS 迁移到SVN,同时证明了 SVN 管理大型项目的可用性),在 KDE 开发者使用了近 10 年 autotools之后,他们终于决定为 KDE4 选择一个新的工程构建工具,其根本原因用 KDE 开发者的话来说就是:只有少数几个“编译专家”能够掌握 KDE 现在的构建体系(admin/Makefile.common),在经历了 unsermake, scons 以及 cmake 的选型和尝试之后,KDE4 决定使用 cmake 作为自己的构建系统。在迁移过程中,进展异常的顺利,并获得了 cmake 开发者的支持。所以,目前的 KDE4 开发版本已经完全使用 cmake 来进行构建。像 kdesvn,rosegarden 等项目也开始使用 cmake,这也注定了 cmake 必然会成为一个主流的构建体系。

2.特点

  a.开放源代码,使用类 BSD 许可发布。http://cmake.org/HTML/Copyright.html
  b.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
  c.能够管理大型项目,KDE4 就是最好的证明。
  d.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
  e.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 libtool。

  d.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。

二、安装cmake

可以直接在命令行下载cmake:

$ sudo apt-get install cmakek

也可以从官网下载最新版本:

http://www.cmake.org/HTML/Download.html

 

三、初试cmake

1.首先创建工作文件夹

$ mkdir  -p ./cmake/cmTest
$ cd cmake/cmTest

2.编写测试代码和CMakeLists.txt

//main.c
#include<stdio.h>
int main()
{
    printf("Hello world!\n");
    return 0;
}
//CMakeLists.txt
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

3.构建工程

$ cmake .

. 表示在当前目录

这里需要注意的地方:

a.CMakeLists.txt文件名的大小写

$ cmake .
CMake Error: The source directory "/home/hwade/hwade/CMake/cmTest2" does not appear to contain CMakeLists.txt.

文件名必须严格按照标题的书写,正确的文件名在书写CMakeLists.txt时关键字和变量会高亮.

b.CMakeLists.txt最后一行的 ${SRC_LIST},在官网中是直接写着SRC_LIST,这样会报错找不到SRC_LIST

$ cmake .
-- This is BINARY dir /home/hwade/hwade/CMake/cmTest -- This is SOURCE dir /home/hwade/hwade/CMake/cmTest -- Configuring done CMake Error at CMakeLists.txt:5 (ADD_EXECUTABLE): Cannot find source file: SRC_LIST Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx -- Build files have been written to: /home/hwade/hwade/CMake/cmTest

尽管错误,同样会生成如下文件:

CMakeCache.txt  CMakeFiles  

但并未生成makefile文件

正确的执行结果:

$ cmake .
-- This is BINARY dir /home/hwade/hwade/CMake/cmTest -- This is SOURCE dir /home/hwade/hwade/CMake/cmTest -- Configuring done -- Generating done -- Build files have been written to: /home/hwade/hwade/CMake/cmTest

目录中的文件

CMakeCache.txt  cmake_install.cmake  main.c
CMakeFiles      CMakeLists.txt       Makefile

输入make命令

$ make
Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/main.c.o
Linking C executable hello
[100%] Built target hello

执行完make命令后就会生成可执行文件

$ ls
CMakeCache.txt  cmake_install.cmake  hello   Makefile
CMakeFiles      CMakeLists.txt       main.c
$ ./hello
Hello World!

4.CMakeLists.txt解释

  我们来重新看一下 CMakeLists.txt,这个文件是 cmake 的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个
CMakeLists.txt。
a. PROJECT 指令的语法是:

PROJECT(projectname [CXX] [C] [Java])

  你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:
<projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,这里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE指令可以直接使用了这两个变量),因为采用的是内部编译,两个变量目前指的都是工程所在路径/home/hwade/CMake/cmTest,后面我们会讲到外部编译,两者所指代的内容会有所不同。同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR变量,他们的值分别跟  HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。为了统一起见,建议以后直接使用 PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即使修改了工程名称,也不会影响这两个变量。如果使用了<projectname>_SOURCE_DIR,修改工程名称后,需要同时修改这些变量。
b. SET 指令的语法是:

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

现阶段,只需要了解 SET 指令可以用来显式地定义变量即可。比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成: SET(SRC_LIST main.c t1.c t2.c)。
c. MESSAGE 指令的语法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)

这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。
FATAL_ERROR,立即终止所有 cmake 过程.
我们在这里使用的是 STATUS 信息输出,演示了由 PROJECT 指令定义的两个隐式变量HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR。
d.ADD_EXECUTABLE指令的语法是:

ADD_EXECUTABLE(hello ${SRC_LIST})

定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列表, 本例中也可以直接写成 ADD_EXECUTABLE(hello main.c)。






初试cmake

原文:http://www.cnblogs.com/catmilk/p/4998053.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!