Table of Contents

前言 项目文件组织 常用的几个内置变量 常用的命令 小结 参考书目

前言

在前面一篇文章中,我们从一个sample入手,了解了CMake的基本用法和语法。但这个例子与实际开发还有一段距离,主要存在以下几点问题:

  • 生成的二进制程序和源程序混在一起
  • 使用gcc进程程序编译,而不是使用交叉编译工具
  • 为指定编译选项,通常会生成debug版本供调试用,release版本用于发布

在本章,我们将sample程序逐步改造,解决上述问题。

项目文件组织

一个项目,通常包含若干子模块。比如上一篇的sample,我们可以认为它包含两个子模块,Hello为程序库,Demo为主程序。很少有项目会把目标二进制文件和源程序放在一起的,通常会建立一个bin目录,存放生成的二进制文件,发布程序则放在release。根据我在项目开发中的习惯,将目录结构修改如下:

            CMakeSample|--- release|--- doc|--- lib|--- source|--- include|--- bin|--- Hello|--- Demo

其中,release存放程序发布相关文件,包括程序文件、脚本、参数等。doc包含项目开发中的相关文档,如设计说明以及通过doxgen等工具从代码中生成的文档。lib存放项目中使用的第三方库,项目中自己编写的库不放在此目录,应该作为项目的一个模块放在source目录下。include包含整个项目中使用的公共头文件,如果子模块中的头文件仅在该子模块类使用,不需放到include目录。bin目录存放编译后的调试版本代码。其它的子目录则为各模块的代码及头文件。

按照以上目录结构,将Hello下的hello.h移到include目录,因为这个头文件被Demo模块包含。这个sample中未使用第三方库,所以暂时为空。

常用的几个内置变量

从上文中我们知道,通过set语句可以自定义变量,然而,CMake还包含大量的内置变量,这些变量和自定义变量的用法没有区别,下面就列出一些常用的变量:

  • CMAKE_C_COMPILER

    指定C编译器,通常,CMake运行时能够自动检测C语言编译器。进行嵌入式系统开发时,通常需要设置此变量,指定交叉编译器。

  • CMAKE_CXX_COMPILER

    指定C++编译器

  • CMAKE_C_FLAGS

    指定编译C文件时编译选项,比如-g指定产生调试信息。也可以通过add_definitions命令添加编译选项。

  • EXECUTABLE_OUTPUT_PATH

    指定可执行文件存放的路径。

  • LIBRARY_OUTPUT_PATH

    指定库文件放置的路径

常用的命令

除了内置变量,我们还可以通过命令来修改编译选项,现将一些常用的命令列出来:

  • include_directories

    指定头文件的搜索路径,相当于指定gcc编译器的-I参数

  • link_directories

    动态链接库或静态链接库的搜索路径,相当于指>定gcc的-L参数

  • add_subdirectory

    包含子目录,当工程包含多个子目录时,此命令有用

  • add_definitions

    添加编译参数,比如add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义

  • add_executable

    编译可执行程序

  • target_link_libraries

    指定链接库,相同于指定-l参数

小结

本文经过修改目录结构,指定编译工具链,生成动态链接库等动作,将前文的sample修改成一个比较接近实际工程的嵌入式环境。当然这个sample仍然只是一个自娱自乐的小玩意,但对于说明CMake用法已经足够了,有了这些基本的CMake知识,在项目中使用CMake就成为可能了。当然不同的环境会遇到一些新问题,借助于互联网,没有什么解决不了的问题。赶快动手吧,抛弃手工编写Makefile的痛苦,加入CMake使用者行列吧。

参考书目

Jan Engels. CMake Tutorial.

CMake使用总结(2)相关推荐

  1. TVM cmake示例展示

    TVM cmake示例展示 本文展示tvm/cmake中config.cmake,tvm/cmake/module/LLVM.cmake,tvm/cmake/module/CUDA.cmake,tvm ...

  2. VScode配置CMAKE文件

    创建一个vscode文件 记得一定要创建一个build文件夹,因为cmake编译过程中产生的中间文件会放到build文件夹中. 打开VScode 配置文件 launch.json {"ver ...

  3. PCL1.9的PCLConfig.cmake文件找不到eigen等外部依赖

    PCL1.9的PCLConfig.cmake文件找不到eigen等外部依赖 由于需要用到PCL中on_nurbs模块做拟合,但是ros自带的pcl中没有该模块.所以源码安装了PCL 1.9,但是在使用 ...

  4. ++项目 cmake头文件路径_CMAKE入门实战

    0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧 ...

  5. cmake java_JNI系列之AS支持CMake了

    写在前面 Android Studio 2.2+已支持CMake编译,与以前NDK-Build方式相比方便了不少,本文旨在引导大家在AS2.2+下一步一步建立JNI工程进行开发,并假设大家已经对JNI ...

  6. cmake开发环境 linux qt_一步步搭建CMake+QT+VTK+BOOST开发环境

    开发环境: 1.可以迅速处理大量并发网络数据包,ASIO库和winpcap 4.1.3库; 2.处理与显示点云模型数据,使用VTK 8.2.0库; 3.项目使用CMake+VC2017编译,GUI使用 ...

  7. 在Ubuntu18.04下的Cmake使用记录

    (1)首先是安装cmake.命令如下: sudo apt-get install cmake (2)创建一个源程序,1.cpp如下:(1.cpp的位置是位于hoem/ysh/code) #includ ...

  8. CMake结合PCL库学习(2)

    紧接着上一篇文章 对于PCL 库中的各个模块之间是有相互依赖关系的 其中Common模块是最基础的模块,其中是定义各种数据结构的头文件,所以Common这个模块是不需要依赖性响的,但是IO 模块就是需 ...

  9. CMake结合PCL库学习(1)

    经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...

  10. 在CentOS 6.3/6.6 64bit上源码安装cmake 3.4.0

    CMake主页是 https://cmake.org/download/ 1.安装必备包 yum install -y gcc gcc-c++ make automake ncurses-devel ...

最新文章

  1. HashTree(哈希树) ——和trie类似,只是将字符换成了质数,sphinx用到了???...
  2. larval mysql 查询转数组_laravel 中将DB::select 得到的内容转为数组
  3. 网络编程套接字(三)
  4. 2018-2019-1 20165219 实验三 实时系统
  5. 深度ip转换器手机版app_手机大师智能管家app下载-手机大师智能管家app官网版 v1.0.0...
  6. 字符串查找KMP算法(转)
  7. nginx的内存管理
  8. win7 nginx php 环境,win7下docker环境搭建nginx+php-fpm+easyswoole+lavarel开发环境
  9. WinForm程序设计-ToolTip控件
  10. Java 病毒感染检测
  11. C# visual studio添加NewtonsoftJSON库
  12. 苹果6s强制删除id锁_苹果ID锁安全神话破灭!2分钟就能解锁
  13. 如何实现电子签章效果
  14. 关于 mysql数据库“ERROR 1118 (42000): Row size too large.“ 的解决方法
  15. 录屏可以录声音吗?录制带声音的视频,这个方法轻松解决
  16. ubuntu 自动切换壁纸
  17. 树莓派4B连不上wifi的一个意想不到的原因
  18. MySQL数据库输入密码后闪退问题的解决方法
  19. 高德 面积计算公式 js版
  20. 检测并替换数据中的离群值——filloutliers函数的MATLAB实现

热门文章

  1. Andoird实现类似iphone AssistiveTouch的控件的demo
  2. 关于微信分享接口开发
  3. Python数据分析18——公务员工资数据分析
  4. Spring中的设计模式:模板方法模式
  5. springboot 2.0中 PUT请求 接收不到参数解决办法
  6. C语言_文件的读与写
  7. Hanoi塔问题分析
  8. 杭电6TDL(暴力)
  9. linux/ubuntu下的代码对比工具Meld Diff
  10. 使用Postman进行压力测试