使用CMake编译

CMake工具用于生成Makefile文件。用户通过编写CMakeLists.txt文件,描述构建过程(编译、连接、测试、打包),之后通过解析该文件,生成目标平台的Makefile文件,做到"Write once, run everywhere"。

 
 

使用CMake的方法很简单:

cmake <projectPath>

确保projectPath目录下,有CMakeLists.txt文件。该文件当然是用户来编写,所以重点是编写CMakeLists.txt,语法可以参考《CMake 入门实战》,或者官方入门文档:

https://cmake.org/cmake-tutorial/

PS:在Windows下使用时,需要使用VS自带的命令行,不然会找不到cl工具的错误。

 
 

成功执行cmake命令后,目录下会生成Makefile文件,不同编译平台生成的文件不同,编译工具也不同。

  • 如果是构建平台是MinGW,会什么makefile文件,使用mingw32-make构建。
  • 如果构建平台是VS系列,会生成vcxproj文件,可以使用msbuild工具构建。
  • 如果构造平台是NMake,可以使用nmake构建。

可以使用以下命令编译:

cmake --build <CMakeCachePath> --target <ProjectName>

CMakeCachePath是指CMakeCache.txt(或CMakeFiles文件夹)所在的路径。

 
 

可以使用以下命令清理编译结果:

cmake --build <CMakeCachePath> --target clean

 
 

如果CMakeLists.txt文件有修改,再次执行cmake命令,会更新Makefile文件。

 
 

关于编译平台的选择

可以使用以下命令,查看cmake支持的构建工具:

cmake -G

 
 

 
 

在生成Makefile时,指定构建工具:

cmake -G "<generator>" <projectPath>

generator可以是等号左边的名字。

 
 

例如,在Windows下,默认生成vcxproj文件(cmake 3.13.0-rc3 + VS2017),如果希望使用nmake构建,可以使用以下命令:

cmake -G "NMake Makefiles" <projectPath>

 
 

关于清理生存文件

存在一个问题,没找到较好的解决方案,如何清理CMake产生的文件?

A:可以使用"-B"参数指定生成目录,这样CMake生成的文件都会集中在这个文件,例如:

cmake -B <buildPath> .

之后在编译操作,均要在buildPath文件夹下执行。

特别的,还可以使用"-S"参数指定源码所在的文件夹,源码文件夹必须包含CMakeLists.txt。

详情可以参考:

https://cmake.org/cmake/help/v3.13/manual/cmake.1.html

CMakeLists.txt编写入门

可以使用Qt Creator新建一个CMake工程,每次修改后CmakeLists.txt文件后,可以在"General Messages"窗口,查看输出内容。

 
 

基础

CMakeLists.txt由命令构造成,每条命令占一行,换行符结尾,命令的格式如下:

commandName(arg1 arg2 …)

命令名不区分大小写参数间使用空格分隔

 
 

在CMakeLists.txt中,字符串同C语言中一样,使用双引号包含

 
 

输出

使用message()命令,输出信息,至少接受两个参数:

第一个参数指定信息的等级,为空的时候为重要信息,通常使用"STATUS"作为参数,代表该信息为普通说明信息。

第二个参数为一个字符串,可以跟随多个字符串。

例如:

message(STATUS "Hello World")

 
 

变量

使用set()命令,自定义变量,至少接受两个参数,第一个参数为变量名,第二个参数为变量的值。参数如果多于2个,那么该变量为一个集合。

特别的,可以使用以下命令设置系统环境变量:

set(ENV{<variable>} <value>...)

 
 

访问变量的格式如下:

${<variable>}

访问系统环境变量需要以下格式:

$ENV{<variable>}

 
 

CMake内置了许多变量,可以参考:

https://cmake.org/cmake/help/v3.13/manual/cmake-variables.7.html

 
 

常用的有:

PROJECT_NAME

项目名

PROJECT_BINARY_DIR

项目编译输出路径,调用cmake命令时,使用"-B"参数指定,默认为CMakeLists.txt所在的文件。

PROJECT_SOURCE_DIR

项目源码路径,调用cmake命令时,使用"-S"参数指定,默认为CMakeLists.txt所在的文件。

CMAKE_DEBUG_POSTFIX

CMAKE_RELEASE_POSTFIX

Debug/Release版的动态库后缀

CMAKE_BUILD_TYPE

编译类型(Debug、Release),该变量默认为空值

内置变量可以在调用cmake命令时,使用"-D"参数设置:

 
 

例子

推荐使用以下命令编译,这样生成的文件集中在build文件夹下,不会污染源码文件夹。

#cd进入CMakeLists.txt所在的文件夹

cmake -B .\build .

cmake --build .\build --target <ProjectName>

 

生成可执行文件

# 指定cmake最低版本

cmake_minimum_required(VERSION 2.8)

 
 

# 指定项目名

project(CppDemo)

# 生成可执行文件,第一个参数为目标名,之后参数为源文件列表

add_executable(${PROJECT_NAME} "main.cpp")

 
 

生成动态库

cmake_minimum_required(VERSION 2.8)

project(HelloWorld)

 
 

# 添加头文件

include_directories($ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/win32)

 
 

# 设置生成目录

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})

 
 

# 生成链接库文件,三个参数分别是链接库名、链接库类型、源码文件

add_library(${PROJECT_NAME} SHARED HelloWorld.cpp)

CMake简易入门的更多相关文章

  1. cmake 简易入门

    目录结构 root -| |--**.cpp |--CmakeList.txt |--current path |--(执行cmake ../) |-- (执行make的目录) 步骤: 1 编写 Cm ...

  2. JNI简易入门

    JNI简介 JNI(Java Native Interface)是JDK的一部分,提供了若干API实现了Java和其他语言的通信(主要是C/C++).JNI主要用于以下场景: 贴近硬件底层的功能,Ja ...

  3. 机器学习简易入门(四)- logistic回归

    摘要:使用logistic回归来预测某个人的入学申请是否会被接受 声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处) 本文内容来源:https://www.dataquest.io/ ...

  4. Pandas简易入门(二)

    目录:     处理缺失数据     制作透视图     删除含空数据的行和列     多行索引     使用apply函数   本节主要介绍如何处理缺失的数据,可以参考原文:https://www. ...

  5. CMake快速入门教程-实战

    http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...

  6. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  7. Web压力测试工具 LoadRunner12.x简易入门教程--(一)回放与录制

        LoadRunner12.x简易入门教程--(一)回放与录制 今天在这里分享一下LoadRunner12.x版本的入门使用方法,希望对刚接触LoadRunner的童鞋有所帮助. LoadRun ...

  8. 转:CMake快速入门教程-实战

    CMake快速入门教程:实战 收藏人:londonKu     2012-05-07 | 阅:10128  转:34    |   来源   |  分享               0. 前言一个多月 ...

  9. crontab简易入门

    前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...

随机推荐

  1. PHP-Manual的学习----【语言参考】----【类型】-----【Resource 资源类型】

    2017年8月24日11:29:361.资源 resource 是一种特殊变量,保存了到外部资源的一个引用.资源是通过专门的函数来建立和使用的.2.由于资源类型变量保存有为打开文件.数据库连接.图形画 ...

  2. BZOJ 1602 [Usaco2008 Oct]牧场行走 dfs

    题意:id=1602">链接 方法:深搜暴力 解析: 这题刚看完还有点意思,没看范围前想了想树形DP,只是随便画个图看出来是没法DP的,所以去看范围. woc我没看错范围?果断n^2暴 ...

  3. 【BZOJ3991】[SDOI2015]寻宝游戏 树链的并+set

    [BZOJ3991][SDOI2015]寻宝游戏 Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩 ...

  4. 【python】-- try except (异常捕获)、断言

    try except (异常捕获) 当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的错误,出现这样的错误代表着什么,我们可以提前捕获这些个错误 1.异常 ...

  5. Java基础 - 标识符

    标识符就是用来给包,类,方法变量等起名字的符号 组成规则: A:unicode字符 数字字符,英文大小写字母,汉字(不建议使用汉字) B:下划线 _ C:美元符 $ 注意事项: A:不能以数字开头 B ...

  6. Android中关于系统Dialog无法全屏的问题(dialog样式)

    自定义一个Dialog,继承了系统Dialog的样式.这时候会发现,即使布局文件中写的width和height都是match_parent,依然无法达到全屏的效果. 原因是:系统dialog的样式.默 ...

  7. SAP basis 二

    使用事务 SMW0 可以在数据库中创建自己的图像.选择选项"二进制数据". 可以按.GIF 格式保存图像. 使用表 SSM_CUST 中的关键字 "START_IMAGE ...

  8. ggplot2绘图系统

    ggplot2包实现了一个在R中基于全面一致的语法创建图形时的系统 .在ggplot2中,图是采用串联起来(+)号函数创建的.详细内容参见<ggplot2:数据分析与图形艺术>,这里只简要 ...

  9. C#BackgroundWorker组件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. butterknif

    // butterknife public class ButterknifeActivity extends Activity { @butterknife.Bind(R.id.tv_title) ...