现在的位置: 首页 > 综合 > 正文

CMake使用总结(2)

2013年07月05日 ⁄ 综合 ⁄ 共 1736字 ⁄ 字号 评论关闭

CMake使用总结(2)

本文使用docbook书写,您可以在这里获得xml文件

Abstract

本文总结了CMake在linux嵌入式系统项目开发中的应用


前言

在前面一篇文章中,我们从一个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官方网站:www.cmake.org.

抱歉!评论已关闭.