ubuntu下使用cmake构建应用程序

1. CMake 简介

  CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

(1)安装cmake,sudo apt-get install cmake
(2)编写 CmakeLists.txt。
(3)执行命令“cmake PATH”生成 Makefile ( PATH是CMakeLists.txt 所在的目录 )
(4)使用 make 命令进行编译。

2. 例程1

我们以一个简单的hello world程序来进行调试:

(1) 编写helloworld.c

#include 

int main(void)
{
    printf("hello world!!\r\n");
    return 0;
}

(2) 编写文件 CMakeLists.txt 并将其与 helloworld.c 放在同一个目录下

PROJECT(helloworld)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(helloworld ${DIR_SRCS})

  CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号”#”后面的内容被认为是注释。
  命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。例如对此例程中的CMakeLists.txt 文件进行分析:

(1) 第一行是一条命令,名称是 PROJECT,参数是 helloworld ,该命令表示项目的名称是 helloworld。
(2) 第二行的命令限定了 CMake 的版本。
(3) 第三行使用命令 AUX_SOURCE_DIRECTORY 将当前目录中的源文件名称赋值给变量 DIR_SRCS。该命令会把参数 dir 中所有的源文件名称赋值给参数 variable
(4) 第四行使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译成一个名称为 main 的可执行文件

3. 例程2

当文档结构如下图,分层次时:

    example_2
        |
        +----helloworld.c
        |
        +----src
              |
              +----helloworld_1.h
              |
              +----helloworld_1.c

根目录下的CMakeLists.txt变化如下:

PROJECT(helloworld)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 
ADD_SUBDIRECTORY( src )
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(helloworld ${DIR_SRCS}  )
TARGET_LINK_LIBRARIES( helloworld Test )

(1) 第三行使用命令 ADD_SUBDIRECTORY 指明本项目包含一个子目录 src 。
(2) 第六行使用命令 TARGET_LINK_LIBRARIES 指明可执行文件 helloworld 需要连接一个名为Test的链接库

src子目录下的CMakeLists.txt如下:

AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)
ADD_LIBRARY ( Test ${DIR_TEST1_SRCS})

  在该文件中使用命令ADD_LIBRARY 将src目录中的源文件编译为共享库。
  在执行cmake的过程中,首先解析目录example2中的CMakeLists.txt ,当程序执行命令ADD_SUBDIRECTORY( src )时进入目录src对其中的 CMakeLists.txt 进行解析

4. CMakeLists.txt常用语法解析

(1)SET(CMAKE_BUILE_TYPE DEBUG)
  指定编译类型,debug 或者为release,debug版会生成相关调试信息,可以使用GDB 进行,release不会生成调试信息。当无法进行调试时查看此处是否设置为debug。
  当这个变量值为Debug的时候,Cmake会使用变量CMAKE_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG。当这个变量值为Release的时候,工程会使用变量CMAKE_CXX_FLAGS_RELEASE和CMAKE_CFLAGS_RELEASE。
(2)SET(CMAKE_C_FLAGS_DEBUG “-g -Wall”)

CMAKE_C_FLAGS_DEBUG —- C 编译器
CMAKE_CXX_FLAGS_DEBUG —- C++ 编译器
-g:编译器在编译的时候,产生调试信息。
-Wall:生成所有警告信息。一下是具体的选项,可以单独使用

5. 内部构建与外部构建

  上面的例子都是“内部构建”,会生成很多临时文件,或者拷贝到其它电脑使用时需要删除相应的cache和中间文件,比较麻烦。使用外部构建会比较简单。

举个简单的例子来说明外部构建,以编译上面的例程2为例:

(1)在根目录中新建build目录
(2)进入build目录,运行 cmake ..(注意..代表父目录,因为父目录存在我们需要的
CMakeLists.txt,如果你在其他地方建立了build 目录,需要运行cmake <工程的全
路径>),查看一下build目录,就会发现了生成了编译需要的Makefile以及其它的中间。
(3)运行make构建工程,就会在当前目录(build目录)中获得目标文件。
这就是out-of-source 外部编译,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录build内。

你可能感兴趣的:(Linux程序设计)