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 简单介绍 图

    http://tech.uc.cn/?p=914     CMake特点 CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手 原生支持 C/C++/Fortran ...

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

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

  3. Kali安装zmap简单介绍

    zmap是一个非常方便的扫描器,跟nmap和masscan一样,不过区别在于zmap他快,号称是一小时扫遍整个互联网.主要使用方式是TCP SYN scan.TCP connectscan.UDP s ...

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

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

  5. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  6. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  7. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  8. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  9. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

随机推荐

  1. IE能够打开网页 可是chrome和火狐打不开网页解决的方法

    一次偶然.电脑的浏览器打不开经常使用的网页,奇怪的是IE能够打开 之外的其它浏览器都不能够,结果百度一下.找到一个帖子,亲自測试一下,果真能够解决.记录例如以下: (1)開始-执行-输入CMD-确定- ...

  2. 前缀 树 背单词(Remember the Word,LA 3942)

    已哭瞎. 搞了2个多小时的错误居然是在  没有初始化............教训:每个例子一定要考虑到初始化问题.! 每个节点存了一个数组  该数组记录的有26个大小  0-25分别表示记录表示'a' ...

  3. BZOJ 3444: 最后的晚餐( )

    把暗恋关系看成无向边, 那某个点度数超过2就无解.存在环也是无解.有解的话对连通分量进行排列就行了. ------------------------------------------------- ...

  4. 不小心中了machook病毒

    此文运用的是优雅的Markdown而书 前段回家过年的日子,我心爱的小air在运行时不停的弹出"machook停止运行"的提醒,上网google一下不看不要紧,才得知是mac上的一 ...

  5. PHP创建定义数组

    $array = array();      $array["key"] = "values";  ?> 在PHP中声明数组的方式主要有两种:1.用arr ...

  6. Fedora 17配置ssh及Windows远程连接

    转载自:http://nanjingjiangbiao-t.iteye.com/blog/1794213 Fedora 23 默认已经安装好openssh server了,不用再装不过默认情况下没有开 ...

  7. 射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作

    前面提到,RC系列内部64个寄存器的正确操作是软件编写的关键.正确设置寄存器首先要做到与寄存器正确通信,其次是要对寄存器写入正确的值. RC系列射频芯片与微控制器的接口有并口和SPI接口两种类型.显然 ...

  8. 高频(工作频率为13.56MHz)

    在该频率的感应器不再需要线圈进行绕制,可以通过腐蚀活着印刷的方式制作天线.感应器一般通过负载调制的方式 的方式进行工作.也就是通过感应器上的负载电阻的接通和断开促使读写器天线上的电压发生变化,实现用远 ...

  9. FreeBSD 10安装KDE桌面环境简介(亲测bsdconfig命令有效)

    FreeBSD 10出来一段时间了,自己摸索装上KDE环境,网上介绍的都是10以前版本的,要么对现在的不合适,走了一大圈弯路还是装不好:要么太繁琐且装了一堆无用的软件.本着让更多人能快速方面的入门Fr ...

  10. Qt控制台和带窗口的区别_mickelfeng_新浪博客

    Qt控制台和带窗口的区别_mickelfeng_新浪博客     t控制台和带窗口的区别    (2012-04-30 10:50:53)    标签:    杂谈        分类: C/C    ...