CMake

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

CMake 使用方法


CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。需要为任何子目录建立一个CMakeLists.txt

其基本操作流程为:

ccmake directory
cmake directory
cmake -DCMAKE_BUILD_TYPE=Debug/Release directory
make

其中,directory为CMakeLists.txt所在目录,Makefile等文件的生成目录为cmake执行目录:

  • 第一条语句用于配置编译选项,如VTK_DIR目录,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步才真正派上用场;
  • 第二条命令用于根据CMakeLists.txt生成Makefile文件;
  • 三条命令用于执行Makefile文件,编译程序,生成可执行文件。

注:为了方便描述,下面的文件目录按照以下规则:

工程顶层目录:/cmake
in source编译下:工程编译发生目录为/cmake
out of source编译下:工程编译目录为/cmake/build
源文件所在目录为:/cmake/src
二进制文件目录:/cmake/build/bin

Cmake目录规则


|----build/builds
|     |----cmake
|     |----mingw32
|     |----msvc
|     |----redhat
|     |----valgrind
|     |----zos
|----common
|----config
|----debug
|----doc
|----include
|----release
|----src
|----tests
|----tools
|----utils
|--- AUTHORS
|--- autogen.bat/sh
|--- CMakeLists.txt
|--- COPYING
|--- INSTALL
|--- MAINTAINERS
|--- NEWS
|--- README.md

CMake常用变量和环境变量


工程顶层目录/cmake

CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR

// 以下环境变量在in source编译情况下为工程顶层目录
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR 

工程构建目录/cmake/build

//out of source编译情况下
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR

与当前Cmake或二进制相关

CMAKE_CURRENT_SOURCE_DIR //当前处理的 CMakeLists.txt 所在的路径。例如源文件所在目录/cmake/src

//如果是in source编译,就是工程顶层目录/cmake
//如果是out of source编译,就是target编译目录(/cmake/build/bin),可以使用ADD_SUBDIRECTORY(src bin)来更改这个值。
CMAKE_CURRRENT_BINARY_DIR

输出相关

EXECUTABLE_OUTPUT_PATH
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

LIBRARY_OUTPUT_PATH
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
  • EXECUTABLE_OUTPUT_PATH表示最终的目标二进制的位置;
  • LIBRARY_OUTPUT_PATH表示最终的共享库。
  • 在哪里ADD_EXECUTABLE或ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义。

PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR

PROJECT_SOURCE_DIR为工程所在目录;PROJECT_BINARY_DIR为编译发生的当前目录,也就是make的执行目录。

CMake指令


CMAKE_MINIMUM_REQUIRED

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

option指令

PROJECT指令

PROJECT(projectname [CXX] [C] [Java])
示例:PROJECT (HELLO CXX)

用来定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。

这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。cmake系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟 <projectname>_BINARY_DIR与 <projectname>_SOURCE_DIR 一致。建议使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。

SET指令

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
示例:SET(SRC_LIST main.cpp t1.cpp t2.cpp)

MESSAGE指令

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
示例:MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

用于向终端输出用户定义的信息,包含三种类型:

  • SEND_ERROR,产生错误,生成过程被跳过。
  • SATUS,输出前缀为—的信息。
  • FATAL_ERROR,立即终止所有 cmake 过程.。

ADD_EXECUTABLE指令

ADD_EXECUTABLE(demo ${SRC_LIST})
ADD_EXECUTABLE(demo main.cpp t1.cpp t2.cpp)

定义了这个工程会生成一个名为demo的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表。

ADD_LIBRARY指令

ADD_LIBRARY(libname [SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
  • SHARED:动态库
  • STATIC:静态库
  • MODULE:在使用dyld的系统有效,如果不支持dyld,则被当做SHARED对待
  • EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

SET_TARGET_PROPERTIES指令

SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)

用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。

INSTALL指令

INSTALL(TARGETS myrun mylib mystaticlib
     RUNTIME DESTINATION bin
     LIBRARY DESTINATION lib
     ARCHIVE DESTINATION libstatic
)
  • 可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
  • 动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
  • 静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录

CMake使用


自定义Makefile目标

运行下面的代码,会先创建一个./debug目录,然后拷贝file.dll到./debug目录。

add_custom_command(
    OUTPUT ./debug/file.dll
    COMMAND mkdir -p ./debug
            cp ./file.dll ./debug
    DEPENDS ./file.dll
)
add_custom_target(dlltest DEPENDS ./debug/file.dll)

add_executable(demo ${SRC_LIST})
add_dependencies(demo dlltest )

欢迎访问我的个人博客click me

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

推荐阅读更多精彩内容

  • 注:首发地址 1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMa...
    cfanr阅读 24,317评论 1 53
  • CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用。 本文目录如下: [1、CMake介绍] [...
    AlphaGL阅读 12,230评论 11 79
  • CMake学习 参考自《Cmake Practice --Cjacker》 基本语法规则 变量的引用 变量使用${...
    techping阅读 2,123评论 0 6
  • 可以设置的变量 使用方式cmake -DCMAKE_INSTALL_PREFIX=yourpath 或在CMAKE...
    赵海洋阅读 1,356评论 0 3
  • 么文与占
    取个名好蓝阅读 152评论 0 0