cmake用法

示例源码
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

    1. 编写 CMake 配置文件 CMakeLists.txt
    1. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile

ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。
。其中, PATH 是 CMakeLists.txt 所在的目录。

  • 使用 make 命令进行编译。
入门案例一(单文件)

先看下目录和源码


1.png

代码的逻辑非常简单就是求10的立方。
重点时候在CMakeLists.txt

# '#'行后面的都是注释

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Calc)

# 指定生成目标  main为编译生成文件, main.cpp为源文件
add_executable(main main.cpp)
  • # 为注释标识
  • cmake_minimum_required是最低版本要求,这个是必须要的
  • project 项目信息
  • add_executable 将main.cpp编译成main

如果我们将cmake_minimum_required (VERSION 2.8)版本改成2.9.2。我的机器上cmake版本是cmake version 2.8.12.2。执行cmake .后报错:

2.png

正常执行完cmake后,会在根目录下生成Makefile。然后我们就可以用make来编译了。

入门案例二(同目录多文件)

这里我们在案例一的基础上新增Math.hMath.cpp

#include "Math.h"
long pow(int base,int power){
        long res=1;
        for(int i=0; i<power; i++) {
                res*=base;
        }
        return res;
}

然后修改main.cpp的include文件,将使用系统的math.h替换成我们自己的Math.h

#include <iostream>
#include "Math.h"
using namespace std;
int main(){
        int x=10;
        int y=3;
        int res=pow(10,3);
        cout<<res<<endl;
        return 0;
}

修改CMakeLists.txt
方法一

add_executable(main main.cpp Math.cpp)

add_executable参数中加入Math.cpp
方法二
如果源文件很多,这样写就很蛋疼了。我们可以使用aux_source_directory命令

aux_source_directory(<dir> <variable>)

该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。

# '#'行后面的都是注释

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Calc)

# 指定生成目标  main为编译生成文件, main.cpp为源文件
# 方法一:一个个添加
# add_executable(main main.cpp Math.cpp)

# 方法二:查找目录下文件到变量中,然后引用变量
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})
入门案例三(多目录、多文件)

对于这种情况,需要分别在项目根目录 Simple和 math 目录里各编写一个 CMakeLists.txt 文件。为了方便,我们可以先将 math 目录里的文件编译成静态库再由 main 函数调用。

3.png

math瞎的CMakeLists.txt内容为:

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

当然,main.cpp引入的头文件也要修改,math.h的位置已经变了。

#include "math/Math.h"
入门案例四(自定义编译选项)
# '#'行后面的都是注释

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Calc)

# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否使用自己的 MathFunctions 库
option (USE_MYMATH
       "Use provided math implementation" ON)

# 是否加入 MathFunctions 库
if (USE_MYMATH)
 include_directories ("${PROJECT_SOURCE_DIR}/math")
 add_subdirectory (math)
 set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(main main.cpp)

# 添加链接库
target_link_libraries(main ${EXTRA_LIBS})

添加config.h.in

#cmakedefine USE_MYMATH

修改main.cpp

#include <iostream>
#include "config.h"

#ifdef USE_MYMATH
  #include "math/Math.h"
#else
  #include <math.h>
#endif

using namespace std;
int main(){
        int x=10;
        int y=3;
        int res=pow(10,3);
        cout<<res<<endl;
        return 0;
}

如果定义了USE_MYMATH就使用自己的Math.h否则include系统的math.h
这里我们可以使用ccmake命令,可以选择ON或OFF。然后按c进行配置。然后再按g进行生成


4.png

5.png
入门案例五(安装和测试)
添加版本号

首先修改顶层 CMakeLists 文件,在 project 命令之后加入如下两行:

# 设置版本号
set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

为了在代码中获取版本信息,我们可以修改 config.h.in 文件,添加两个预定义变量:

#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

程序中就可以获取相关信息

cout<<"Version "<<Demo_VERSION_MAJOR<<"."<<Demo_VERSION_MINOR<<endl;
生成安装包

首先在顶层的 CMakeLists.txt 文件尾部添加下面几行:

# 构建一个 CPack 安装包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
  "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)

上面的代码做了以下几个工作:

导入 InstallRequiredSystemLibraries 模块,以便之后导入 CPack 模块;
设置一些 CPack 相关变量,包括版权信息和版本信息,其中版本信息用了上一节定义的版本号;
导入 CPack 模块。

  • 生成二进制安装包:
cpack -C CPackConfig.cmake
6.png
  • 生成源码安装包
cpack -C CPackSourceConfig.cmake
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用。 本文目录如下: [1、CMake介绍] [...
    AlphaGL阅读 12,219评论 11 79
  • 注:首发地址 1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMa...
    cfanr阅读 24,257评论 1 53
  • 1.安装 $sudo apt-get install cmake 2.示例:简单的文件目录 sample |—...
    荷包蛋酱阅读 29,615评论 0 15
  • 虚假的爱恋 背离的诺言 你说的未来,那么远 时光的蹉跎 青春的离散 为了爱你,我的人生那么暗 清醒的瞬间 重生的容...
    人生是一场旅行阅读 177评论 0 0
  • 人们先是观察某种行为,然后才接受它。
    这里Cc阅读 106评论 0 0