http://tech.uc.cn/?p=914

 
 

CMake特点

  • CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手
  • 原生支持 C/C++/Fortran/Java 的相依性的自动分析功能,免除了程序员对代码依赖的调整,对整个开发工作帮助很大
  • 支持 SWIG、Qt、FLTK 开发框架
  • 支持跨平台编译,这是CMake名字的来源
  • 能够转换特殊平台的 IDE 项目文档,如xcode
  • 与Dart、CTest 和 CPack 集成,可以组成自动化的构建系统

CMake vs GNU AutoTools

使用CMake,程序员必需编写好CMake脚本CMAkeLists.txt,对于一些复杂的项目,可能需要编写CMake模块,但对于构建过程而言,则是极其简单的。
相形之下,GNU AutoTools是很复杂的,无论是程序员在撰写Makefile.am,还是构建时的步骤。致命的是,GNU AutoTools间很难兼容。

GNU AutoTools构建流程

CMake 构建流程

另外,CMake的构建过程会比GNU AutTools在速度上有优势,在输出上更是很友好。

下面的是来自Google的趋势图,可以看出CMake的应用情况。

简单的CMake项目

我们先来看个简单的CMake项目。这里有4个文件:CMakeLists.txt, main.cpp, pr.cpp, pr.h。

CMakeLists.txt的内容如下:

project(MyProject)
cmake_minimum_required(VERSION2.8)
add_library(pr SHARED pr.cpp)

target_link_libraries(pr m)
add_library(prs STATIC pr.cpp)
target_link_libraries(prs m)
set_target_properties(prs PROPERTIES OUTPUT_NAME pr)
add_executable(mypr main.cpp)
target_link_libraries(mypr pr)

set(PR_HEADER pr.h)
install(TARGETS mypr pr prs
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
install(FILES ${PR_HEADER}
DESTINATION include)

这个CMake脚本声明了此项目名为MyProject,并要求cmake的最少版本为2.8。
通常情况下2.6以上的特性不会用到,除非在一些复杂的项目中要自己处理一些问题而用到例如function这样的宏。

  • add_executable的作用是指示CMake生成一个可执行文件。
  • add_library的作用是指示CMake生成一个库,根据参数SHARED还是STATIC来决定生成动态库还是静态库。
  • target_link_libraries指示传递给ld的外部库,相当于传给gcc的-lxx。
  • set_target_properties则是用于修改构建目标的一些属性,如上的语句则是让目标prs的输出libprs.a改名为libpr.a。
  • set是CMake中常用的命令,用于设置变量,也能修改内部变量
  • install用于生成make install使用的语句

要构建这个项目,可在所在目录建立一个目录,例如名为build,并切换到该目录,然后执行cmake .. && make

路径

一般的项目会涉及到多个模块,文档以及测试用例等。下图为一般CMake项目的文件布局。每一层目录如果包含有构建目标,一般都会有一个CMakeLists.txt。

包含CMakeLists.txt的子目录通常由上层的CMakeLists.txt用语句add_subdirectory来包含。对于这个项目而言,顶层的CMakeLists.txt包含如下的语句:

add_subdirectory(include)
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(docs)

在多个模块的情况下,可能一个模块的链接依赖於其它模块,例如一个可执行二进制需要链接某些模块,此时link_directories将有发挥作用。
如在CMakeLists.txt增加:
link_directories(${MyProject_BINARY_DIR}/src/libxxx
${MyProject_BINARY_DIR}/src/libyyy)

将指示CMake在LDFLAGS附加-Lsrc/libxxx -Lsrc/libyyy。

放置在src下的代码要引用include的头文件,可以使用相对路径引用,也可以让include放置在头文件搜索路径中,即CPPFLAGS,-Iinclude。如何指示CMake呢?只需要加上include_directories(BEFORE include),或者include_directories(BEFORE ${MyProject_SOURCE_DIR}/include),前者引用CMakeLists.txt的相对路径,而后者则是依项目的完整路径。

其它

在上面提及到set可以修改一些内部变量,例如可以修改编译器的参数,如

set(CMAKE_C_FLAGS ”-std=c99 -O2 -pipe -Wall -Wextra”)
set(CMAKE_C_FLAGS_DEBUG ”${CMAKE_C_FLAGS} -g -ggdb -pg”)
set(CMAKE_C_FLAGS_RELEASE ”${CMAKE_C_FLAGS} -s -DNDEBUG”)

CMake还提供了一些find函数,如find_package、find_library,用于检查项目构建的依赖或者控制功能的开启。
这些功能已经超出今天的简单介绍,有兴趣的朋友请参考官方资讯。

参考

http://www.cmake.org/Wiki/CMake:Articles
http://www.cmake.org/Wiki/CMake_FAQ
http://techbase.kde.org/Development/CMake
http://techbase.kde.org/Policies/CMake_Coding_Style

您可能感兴趣的文章

CMake 简单介绍 图的更多相关文章

  1. CMake 简单介绍

    CMake特点 CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手 原生支持 C/C++/Fortran/Java 的相依性的自动分析功能,免除了程序员对代码依赖 ...

  2. UML动态模型图简单介绍

    UML动态模型图描述了系统动态行为的各个方面,包括用例图.序列图.协作图.活动图和状态图.下面就每种图做一个简单介绍: 用例图 用例图描述系统外部的执行者与系统提供的用例之间的某种联系.所谓用例是指对 ...

  3. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

  4. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&勘误&配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  5. Kurento应用开发指南(以Kurento 5.0为模板) 之中的一个:简单介绍,安装与卸载

    文件夹 1. Kurento是什么               3 2. Kurento简单介绍                       3 2.1 WebRTC媒体server         ...

  6. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  7. iOS-iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  8. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  9. SharePoint 2010 网站备份还原简单介绍

    今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...

随机推荐

  1. dictionary ----- python

    Learn of dictionary,simple example of dictionary in  “Simple Python tutorial"------------------ ...

  2. 随机List中数据的排列顺序

    把1000个数随机放到1000个位置. 这也就是一个简单的面试题.觉得比较有意思.就顺带写一下 举个简单的例子吧. 学校统一考试的时候  有 1000个人,然后正好有 1000个考试位置,需要随机排列 ...

  3. adb的logcat使用

    预备:安装刷机精灵,实用工具->adb命令行 1. 对于多机设备,首先使用adb devices来获知设备名称: 2. 将log输出到电脑:adb –s [设备名称] shell logcat ...

  4. BenchmarkDotNet

    .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET F ...

  5. 在线CSS圆角生成器

    http://www.paibaidu.com/demo/CSSBorder/CSSBorder.html

  6. Ubuntu下su:authentication failure的解决办法

    $ su - rootPassword: su: Authentication failureSorry. 这时候输入 $ sudo passwd rootEnter new UNIX passwor ...

  7. Delphi与Java中的日期互换

    在最近做的一个项目中用到了Java和Delphi,发现它们不能正确读取对方的日期类型,如在Java中写入一个值为“2007-12-1”的日期值,通过Delphi读取却不是这个值了.通过查阅资料,发现两 ...

  8. Android开源项目发现---TextView,Button篇(持续更新)

    android-flowtextview 文字自动环绕其他View的Layout 项目地址:https://code.google.com/p/android-flowtextview/ 效果图:ht ...

  9. TinyMCE logo 可视化HTML编辑器 TinyMCE

    TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成.功能配置灵活简单(两行代码就可以 将编辑器嵌入网页中),支持AJAX.另一特点是加载速度 ...

  10. lc面试准备:Remove Duplicates from Sorted List

    1 题目 Given a sorted linked list, delete all duplicates such that each element appear only once. For ...