CMake是一个跨平台的安装(编译)工具,是一个比Make更高级的的编译配置工具,可以根据不同平台、不同编译器,通过编写CmakeLists,可以控制生成的Makefile,从而控制编译过程。

    决定代码的组织方式及其编译方式,也是程序设计的一部分,类似autotools和cmake这样的项目构建工具就是帮助我们构建和维护代码的。

    (1)CMake的特点

.开放源码,实用类BSD许可发布;
.跨平台:
在linux/unix平台,生成Makefile;
在mac平台能够生成xcode;
在windows平台能够生成msvc工程的配置文件,
.简化构建过程和编译过程,只需要cmake + make 就可以了;
.高效率;
.可扩展,可以为cmake编写特定功能的模块,扩充cmake的功能;

    (2)CMake的简单范例

    源码 main.c

// main.c
#include <stdio.h> int main(void)
{
printf("Hello World\n");
return ;
}

    配置文件 CMakeLists.txt

#cmake最低版本需求,不加入此行会受到警告信息
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(HELLO) #项目名称
#把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
#生成应用程序 hello (在windows下会自动生成hello.exe)
ADD_EXECUTABLE(hello ${SRC_LIST})

    执行命令

cmake .

    外部编译方式

在上述例子中存在的问题是,cmake和make执行产生的中间文件与源文件main.c、配置文件CMakeLists.txt混在一起;外部编译方式将在test目录下新建build文件夹,在进入build文件夹后采用 cmake .. 命令 将所有中间文件及目标文件生成在build文件夹,当需要删除时可以直接删除该目录。

    (3)CMakeList参数详解

()PROJECT
语法:PROJECT(projectname [CXX] [C] [JAVA])
功能:定义工程的名称和定义工程支持的语言,这个命令也隐式指定了两个cmake变量:
<projectname>_BINARY_DIR 目标文件目录
<projectname>_SOURCE_DIR 源文件目录
()SET
语法:SET ( VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]] )
功能:用来显示地定义变量。如果有多个源文件1.c .c .c 可以这样设置
SET(SRC_LIST .c .c .c)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 设置保存可执行文件到工程编译路径下的bin子目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 设置库文件保存到工程编译路径下的lib子目录
()MESSAGE
语法:MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
功能:这个指令向终端输出用户信息,包含三种类型:
SEND_ERROR:生成错误信息
STATUS:输出状态信息,带--
FATAL_ERROR:立即终止所有cmake进程
()ADD_EXECUTABLE
用法:ADD_EXECUTABLE(DEST SRC_LIST)
功能:根据源文件SRC_LIST生成可执行文件DEST
()ADD_SUBDIRECTORY
用法:ADD_SUBDIRECTORY(SUBDIR DESTDIR)
功能:添加当前子目录SUBDIR,并将子目录SUBDIR中CMakeLists.txt中待生成的目标文件生成到编译目录的子目录DESTDIR下
SUBDIRS(SUBDIR1 SUBDIR2)此指令可以一次添加多个子目录,但生成的中间文件和目标文件都将在编译目录下重复一份
(6)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
指定版本,放在工程根目录CMakeLists.txt的开始
(7)ADD_LIBRARY(DEST type FILE_LIST)
DEST 库名
TYPE:静态库还是动态库 static or shared
FILE_LIST:源码列表
(8)SET_TARGET_PROPERTIES
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")将hello_static静态库的显示名称改为helo
(9)GET_TARGET_PROPERTY
GET_TARGET_PROPERTY(var hello_static OUTPUT_NAME)获取hello_static库的OUTPUT_NAME属性设置到变量var上
(10)INCLUDE_DIRECTORIES
用法:INCLUDE_DIRECTORIES(DIR)
功能:将目录DIR包含进头文件搜索路径
(11)LINK_DIRECTORIES
用法:LINK_DIRECTORIES(DIR)
功能:指定要链接的库所在的搜索路径
(12)TARGET_LINK_LIBRARIES
TARGET_LINK_LIBRARIES(DESTLIB YLLIB)
DESTLIB:待编译成的目标库
YLLIB:依赖的库名
(13)INSTALL
用法:安装库文件、可执行文件、脚本文件等到目标路径,还可以CMAKE脚本或者CMAKE命令
INSTALL(TARGETS target
RUNTIME DESTINATION bin #可执行文件安装路径
LIBRARY DESTINATION lib #动态库安装路径
ARCHIVE DESTINATION libstatic) #静态库安装路径
INSTALL(FILES files
DESTINATION DIR
PERMISSIONS permissions) #赋予权限 OWNER_WRITER,OWER_READ,GROUP_READ,WORLD_READ #664权限
INSTALL(PROGRAMS files
DESTINATION DIR
PERMISSIONS permissions) #赋予权限 OWNER_EXECUTE,GROUP_EXECUTE,WORLD_EXECUTE #775权限
INSTALL(SCRIPT ......) 执行脚本
INSTALL(CODE ......) 执行命令

    (4)CMake综合范例

文件目录树如下:

本范例将实现下列目标:

.利用cmake_test/src/util目录下的static_print.c和cmake_test/include下的static_print.h生成静态库libutil.a,动态库libutil.so;
.将libutil.a、libutil.so生成到cmake_test/lib目录下;
.利用cmake_test/src/main目录下的main.cpp和libutil.a库和cmake_test/include下的头文件static_print.h头文件生成可执行文件hello;
.将可执行文件hello生成到cmake_test/bin目录下
5.将cmake_test目录下的README文件安装到/backup/doc下,将cmake_test工程下runhello.sh脚本安装/backup/bin
6.将cmake_test目录下的lib/libutil.a libutil.so安装到/backup/lib目录下

1)cmake_test/CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src)
INSTALL(PROGRAMS runhello.sh
        DESTINATION bin
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ
        )
INSTALL(FILES README DESTINATION doc

2) cmake_test/include/static_print.h

#ifndef _STATIC_PRINT_H_
#define _STATIC_PRINT_H_ namespace cmake_test
{
class CMakeTest
{
public:
void cmake_print();
};
}
#endif

3)cmake_test/src/CMakeLists.txt

ADD_SUBDIRECTORY(util)
ADD_SUBDIRECTORY(main)

4) cmake_test/src/util/CMakeLists.txt

SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
SET(CMAKE_C_COMPILER g++)
SET(SRC_LIST static_print.c) INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
ADD_LIBRARY(util STATIC ${SRC_LIST})
ADD_LIBRARY(util_shared SHARED ${SRC_LIST})
SET_TARGET_PROPERTIES(util_shared PROPERTIES OUTPUT_NAME "util")
INSTALL(TARGETS util util_shared
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib

5)cmake_test/src/util/static_print.c

#include<stdio.h>
#include "static_print.h" namespace cmake_test
{
void CMakeTest::cmake_print()
{
printf("cmake static library print!");
}
}

6)cmake_test/src/main/CMakeLists.txt

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
SET(SRC_LIST main.cpp)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib) ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello util)

7)cmake_test/src/main/main.cpp

#include<iostream>
#include "static_print.h"
using namespace std; int main()
{
//1.使用被链接的静态库
cmake_test::CMakeTest test;
test.cmake_print();
//2.当前程序
printf("this is current main.cpp!");
return ;
}

8)cmake_test/runhello.sh

hello

9)在cmake_test下

touch README

10)创建如下目录

mkdir /backup/lib
mkdir /backup/bin
mkdir /backup/doc

11)在cmake_test目录下创建build目录,并在cmake_test/build执行如下命令

cmake -DCMAKE_INSTALL_PREFIX=/backup ..
make install

执行过程与结果如下:

(7)Cmake的使用简介的更多相关文章

  1. 基于Cmake+QT+VS的C++项目构建开发编译简明教程

    目录 一.工具下载与安装 1.     Qt 2.     Visual Studio 2015 3.     Cmake 二.C++及Qt项目构建 1.     基于VS构建Qt项目 2.     ...

  2. 学习 opencv---(6)玩转opencv源代码:生成opencv 工程解决方案与opencv 源码编译

    在这篇中,我们探讨如何通过已安装的opencv选择不同的编译器类型,生成高度还原的OpenCV开发时的解决方案工程文件,欣赏OpenCV新版本中总计 六十六多万行的精妙源代码.我们可以对其源代码进行再 ...

  3. 【转载】CMake 简介和 CMake 模板

    转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...

  4. CMake简介

    目录 一.CMake简介 二.CMake典型示例 源代码 demo.cpp cmake脚本 CMakeLists.txt 编译流程 三.CMake常用命令 常用命令介绍 设置编译目标类型 指定编译包含 ...

  5. CMake 构建项目教程-简介

    CMake 构建项目教程-简介 Linux 平台构建项目,选择了CLion作为C++的IDE,而CLion默认就是使用CMake构建项目,所以这里记录了CMake在构建项目过程的一些小知识. 1. 项 ...

  6. CMake 简介与使用

    cross platform make的缩写. 是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目文件.通过编写CMakeLists ...

  7. cmake命令 安装、用法简介

    前言 cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品.后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目.其官方网站是www.cm ...

  8. cmake 简介

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...

  9. Linux C++ 开发简介

    主要介绍将Windows程序迁移到Linux系统相关知识 简介 Windows程序迁移到Linux系统可能需要修改很多代码, 既需要了解Linux平台的开发知识, 也需要了解Windows平台代码如何 ...

随机推荐

  1. 求解区间问题的三种做法的区别 线段树、树状数组、RMQ

    树状数组主要用于计算区间的和,在区间元素修改值的时候能够快速修改而不是以O(n)的复杂度进行修改: 线段树是把区间以树的形式分拆为若干个小区间,每个小区间存的都有一个值(树状数组的元素存的是区间值), ...

  2. Codeforces Round #381 (Div. 2) C. Alyona and mex(无语)

    题目链接 http://codeforces.com/contest/740/problem/C 题意:有一串数字,给你m个区间求每一个区间内不含有的最小的数,输出全部中最小的那个尽量使得这个最小值最 ...

  3. codeforces 743D. Chloe and pleasant prizes(树形dp)

    题目链接:http://codeforces.com/contest/743/problem/D 大致思路挺简单的就是找到一个父节点然后再找到其两个字节点总值的最大值. 可以设一个dp[x]表示x节点 ...

  4. 一篇文章看懂JS执行上下文

     壹 ❀ 引 我们都知道,JS代码的执行顺序总是与代码先后顺序有所差异,当先抛开异步问题你会发现就算是同步代码,它的执行也与你的预期不一致,比如: function f1() { console.lo ...

  5. grep : app :Is a directory

    今天在查日志的时候用grep命令,遇到这样的一个问题,grep : app :Is a directory 用的grep命令是这样的:grep -10 '2019-08-14 21:22:39.252 ...

  6. 【Linux】一些常用命令(待整理)

    一.关机重启命令 二.查询ip 三.查询杀死进程 四.CentOS7 关闭防火墙 五.vim常用 5.1 搜索 5.2 设置行号 剪切 替换 一.关机重启命令 shutdown -h 10 #计算机将 ...

  7. 手工释放服务器的swap分区缓存

    时间     恢复时间 状态 信息 主机 问题 • 严重性 持续时间 确认 动作 2019-03-21 20:29:30     09:51:30     -ai-代理 Lack of free sw ...

  8. 数论 Day 12

    数论是个好东西 今天讲的是组合计数 组合计数 组合数学主要是研究一组离散对象满足一定条件的安排的存在性.构造及计数问题.计数理论是狭义组合数学中最基本的一个研究方向,主要研究的是满足一定条件的排列组合 ...

  9. linux中安装vsftpd出现的问题

    提示:安装vsftpd必须要在root用户下才能安装成功,进入root:su -(中间有空格) 问题: 1.再用命令getsebool -a | grep ftpd命令查看查看状态时出现的问题:SEL ...

  10. 史上最详 Thymeleaf 使用教程

    前言 操作前建议先参考我的另一篇博客:玩转 SpringBoot 2 快速整合 | Thymeleaf 篇 查看如何在SpringBoot 中使用 Thymeleaf.还有一点需要注意的是:模版页面中 ...