CMake的简单应用

 各种不同的Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。如果软件想跨平台,必须要保证能够在不同平台编译,这就得为每一个Make工具写一次 Makefile ,这将是一件让人抓狂的工作。使用CMake工具就可以很好的解决这个问题。

  CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目,生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。

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

  1. 编写 CMake 配置文件 CMakeLists.txt 。

  2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目录。

  3. 使用 make 命令进行编译。

语法

  CMake基本语法由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。变量引用使用 ${VAR} 形式。

  command (args  ...)  #comment

常用命令:

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

  project (Demo)               # 指定项目的名称

  set(SRCS main.cpp ...)             # 设置变量

  include_directories(/usr/include/jsoncpp)        # 添加头文件目录,比如使用的一些lib库

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

  add_subdirectory(math)           # 添加 math 子目录

  add_executable(Demo main.cc ...)       # 指定生成目标,第一个参数为目标文件名

  add_library(MathFunctions ${DIR_LIB_SRCS})   # 添加一个库文件

  target_link_libraries(Demo MathFunctions)    # 添加链接库

获取更多CMake信息:

  cmake --help

  cmake --help-command-list

  cmake --help-variable-list

示例代码

示例代码1:

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

set(CMAKE_CXX_FLAGS "-std=c++0x")      # 设置编译参数
include_directories(/usr/include/jsoncpp) # 添加头文件目录

set(SRCS                     # 设置变量SRCS,将所有源文件添加到变量SRCS
  SamsungRequestResolver.cpp
  SamsungResolverContainer.cpp
  SamsungResponseResolver.cpp
  BanCat.cpp
  main.cpp
)

add_executable(framework ${SRCS})     # 指定生成目标
target_link_libraries(framework jsoncpp hiredis boost_system)  # 添加链接库

示例代码2:(来源于参考引用1)

代码目录如下所示,./Demo3目录下有一个main.cc文件和一个math目录。对于这种嵌套目录的情况,需要在目录 ./Demo3 和 ./Demo3/math 下各创建一个CMakeLists.txt。

./Demo3
  |
  +--- main.cc
  |
  +--- math/
     |
     +--- MathFunctions.cc
     |
     +--- MathFunctions.h

父目录中的 CMakeLists.txt :

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加 math 子目录,math目录下的CMakeLists.txt文件和源代码会被处理
add_subdirectory(math)
# 指定生成目标Demo
add_executable(Demo main.cc)
# 添加链接库
target_link_libraries(Demo MathFunctions)

子目录中的 CMakeLists.txt:

 # 查找当前目录下的所有源文件
 # 并将名称保存到 DIR_LIB_SRCS 变量
 aux_source_directory(. DIR_LIB_SRCS)
 # 生成链接库
 add_library(MathFunctions ${DIR_LIB_SRCS})

编译

  在编译之前,首先要将CMakeLists.txt文件放在代码目录中。为了方便管理生成的makefile文件、目标文件等文件,最好创建一个build目录专门用来存放这些文件。在代码目录,依次执行以下命令:

mkdir build
cd build
cmake ..
make

参考引用:

  1. http://www.hahack.com/codes/cmake/
  2. https://www.cnblogs.com/qixianyu/p/6574048.html

到此这篇关于CMake的简单应用的文章就介绍到这了,更多相关CMake入门内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 超详细的cmake入门教程

    什么是cmake 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MSnmake,BSD Make(pmake),Makepp,等等.这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别.这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译.而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作. CMake CMake附图 1 CMake就是针对上

  • CMake的简单应用

    各种不同的Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别.如果软件想跨平台,必须要保证能够在不同平台编译,这就得为每一个Make工具写一次 Makefile ,这将是一件让人抓狂的工作.使用CMake工具就可以很好的解决这个问题. CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile.通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程.CMake自动生成的Makefile

  • centos 7 vscode cmake 编译c++工程的教程详解

    一.环境说明 1)gcc/g++  cmake安装建议 gcc/g++内核自带的即可,如果需要新的自行安装, cmake也一样,如有需要新的版本自行安装. 2)vscode安装插件 必要的插件c/c++ 0.28.1 cmake 0.0.17 cmake tools 1.4  (这几个插件的版本可能会不同,以扩展搜索到的最新的为准) 二.创建项目实验 1)打开项目文件夹 第一步:打开vscode,点击左上角文件,在下拉菜单选择打开文件夹!注意,是打开文件夹,不是工作区,也不是其它的!! 第二步:

  • vs2019+cmake实现Linux远程开发的方法步骤

    在上一篇文章中我们介绍了使用vs2019作为远程Linux系统的开发环境,但我们是创建的传统的sln项目,而对于Linux开发者来说以autotools或是cmake进行项目结构的组织更为简单直观,也符合在Linux环境上的习惯. autotools是较为古老的也是使用最为广泛的构建系统,你在Linux上总是避免不了类似./configure && make这样的命令,背后就是autotools为你完成了检测系统环境到生成makefile的一系列工作. cmake是较新的一种工具,auto

  • CMake语法及CMakeList.txt简单使用小结

    目录 CMake简单介绍 创建项目 CMake语法 常用的命令 常用的变量 简单使用实例 CMake简单介绍 Cmake主要用于开发跨平台的C++项目,对于Windows程序员来说,在Linux上开发C++程序会非常困难,一来没用过makefile,其语法非常生疏难懂,二来visual studio编译器实在优点太多(目前最新推出的vs2022中开启效率得到了质的提升,而且内置的IntelliCode更是直呼内行).这就导致C++不同于其他语言,硬生生催生出Windows程序员和Linux程序员

  • 实例分享cmake编译一个简单c++项目(demo)

    下面通过一个小例子来说明cmake编译一个c++项目,生成可执行文件: 整理目录结构: CMake Lists.txt addlib build main.cpp 电脑上没有tree命令,也不大敢截图,将就着看看,其中build是cmake编译指定的路径,addlib下面也有一个头文件和源文件  ,还有一个CmakeLists.txt,可以看下: CMake Lists.txt library.cpp library.h 先看各个文件的代码: addlib/library.h: #ifndef

  • VS2019中CMake项目的简单使用方法

    在使用Visual Studio的时候很多人都应该碰过在使用scanf的时候会报错等问题,虽然把SDL检查关了就能解决,但是此方法在博主使用VS2019的时候,却有失灵的时候.所以决定在日常刷题的时候使用CMake项目来编译代码.因为CMake项目并不会因为使用scanf而报错.以下是博主使用CMake的一些总结,仅供参考. 1.建立CMake项目文件 在创建项目界面可直接搜索cmake找到创建项目. 为了方便使用可以选择将解决方案和项目放到同一个目录. 2.CMakeList的配置 在创建好项

  • cmake ios终端下执行提示错误 iOS version not found, tested: [5.0;5.1;6.0;6.1;7.0;8.3]的解决方案

    先给大家简单说下CMake. CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目. 通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程. CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install).测试安装的程序是否能正确执行(make test,或者ctest).生成当前平台的安装包(make package).生成源码

  • 详解Android studio ndk配置cmake开发native C

    Android 2.2 以后的版本对NDK的支持已经非常好了.最近把一个纯C的android项目,从eclipse ADT迁移到Android studio上.本文是参考Add C and C++ Code to Your Project官方文档(需要翻墙),经过各种尝试之后的总结. Android studio整合NDK开发,有两种模式,一种是ndk build,一种是cmake,如果是新项目官方推荐cmake.原来,ADT的时候只能用ndk build,这次切换IDE并没有选用ndk bui

  • 详解Android JNI的基本使用(CMake)

    简介 什么是JNI JNI的全称是Java Native Interface:Java本地开发接口,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++),目的就是Java可以调用C或C++开发的函数,C或C++也能调用Java的方法.这样有很多有点,其一就是效率,C/C++是本地语言,比java更高效:其二就是可以复用已经存在的C/C++代码:其三是Java反编译比C语言容易,一般加密算法都是用C语言编写,不容易被反编译. 什么是NDK和CMake NDK全称是Native D

  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    Note:这篇文章是基于Android Studio 3.01版本的,NDK是R16. step1:创建一个包含C++的项目 其他默认就可以了. C++ Standard 指定编译库的环境,其中Toolchain Default使用的是默认的CMake环境:C++ 11也就是C++环境.两种环境都可以编库,至于区别,后续会跟进,当前博文使用的是CMake环境. Exceptions Support 如果选中复选框,则表示当前项目支持C++异常处理,如果支持,在项目Module级别的build.g

随机推荐