CMake使用总结(2)

前言

在前面一篇文章中,我们从一个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 EngelsCMake Tutorial.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值