Cmake Practice

0、前言

因为在使用OpenCV的过程中都接触到了许多关于CMake的使用,于是就想了解一下CMake究竟是怎样一个东西,有什么作用。顺便做一个学习笔记。 
本文参考《CMake Practice》这篇文章完成,旨在指导用户快速使用CMake,如果需要更详细的内容,请通读《CMake Practice》这篇文章。下载路径:http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf

1、CMake简介

CMake是一个工程构建工具,能够自动生产makefile文件,方便构建编译文件,链接库,安装文件等。

cmake 的特点主要有: 
1,开放源代码,使用类 BSD 许可发布。http://cmake.org/HTML/Copyright.html 
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 在工具链中没有 libtool。 
6,可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。

cmake基本语法规则: 
前面提到过,cmake 其实仍然要使用”cmake 语言和语法”去构建,上面的内容就是所谓的”cmake 语言和语法”,最简单的语法规则是: 
1,变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名 
2,指令(参数 1 参数 2…) 
参数使用括弧括起,参数之间使用空格或分号分开。 
3,指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。

2、CMakeLists.txt文件分析

每个需要编译的目录(子目录)都要有一个CMakeLists.txt文件 
在工程目录下的CMakeLists.txt文件称作工程CMake文件,在这个文件里需要指出工程名字,需要编译的子目录,例如:

{
    cmake_minimum_required(VERSION 3.5)

    PROJECT(HELLO)
    ADD_SUBDIRECTORY(src)
}

  • cmake_minimum_required(VERSION 3.5): 
    功能说明: 规定cmake程序的最低版本。可选 
    • 如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行cmake

  • PROJECT 指令: 
    功能说明: 声明一个工程 
    语法: PROJECT(projectname [CXX] [C] [Java]) 
    参数说明:

    • projectname:定义工程名称
    • [CXX]…:指定工程支持的语言列表,可忽略的,默认表示支持所有语言

    这个指令隐式的定义了两个 cmake 变量: 
    ==_BINARY_DIR== 以及 ==_SOURCE_DIR==。 
    前者表示编译输出的路径;后者表示工程所在的路径。


  • ADD_SUBDIRECTORY 指令: 
    功能说明: 添加需要编译的源文件的子目录 
    语法: ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) 
    参数说明: 
    • source_dir:向当前工程添加存放源文件的子目录
    • [binary_dir]:指定中间二进制或目标文件存放的位置
    • [EXCLUDE_FROM_ALL]:将该目录从编译过程中排除

接下来给出一个在子目录的CMakeLists.txt文件

{
    INCLUDE_DIRECTORIES(/usr/include/thrift)
    SET(SRC_LIST main.cc
            rpc/CRMasterCaller.cpp
            rpc/CRNode_server.skeleton.cpp
            rpc/Schd_constants.cpp
            rpc/CRMaster.cpp
            rpc/CRNode.cpp
            rpc/Schd_types.cpp
            task/TaskExecutor.cpp
            task/TaskMoniter.cpp
            util/Const.cpp
            util/Globals.cc
            util/utils.cc
            util/Properties.cpp
            )

    ADD_EXECUTABLE(crnode ${SRC_LIST})
    LINK_DIRECTORIES(/usr/lib /lib/local/lib)
    TARGET_LINK_LIBRARIES(crnode log4cpp thrift)
    MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
    MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})

    INSTALL(TARGETS crnode
            RUNTIME DESTINATION bin
    )    
}

注:

你可能感兴趣的:(其他软件,cmake)