CMAKE简单入门

来源:互联网 发布:淘宝商城珠宝 编辑:程序博客网 时间:2024/06/08 06:00

CMAKE简单入门

单目录工程的CMAKE配置与编译

如果所有编译需要的文件都在同一个目录下,此时CMAKE比较容易配置。
首先建立如下所示的文件夹 Test

Test    -- main.cpp    -- tools.h    -- tools.cpp

然后在 tools.h 中声明一个函数 void display() ,然后在 tools.cpp 中完成函数定义。最后在 main.cpp 中调用 void display() 函数。

比如,文件 tools.h如下:

#ifndef _TOOLS_H#define _TOOLS_H#endif#include <iostream>using namespace std;void display();

文件 tools.cpp如下:

#include "tools.h"void display(){    cout<<"This CMAKE project works!"<<endl;}

文件 main.cpp 如下:

#include "tools.h"int main(){    display();}

然后在 Test 文件夹根目录添加 CMakeLists.txt 文件如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)PROJECT(TEST)AUX_SOURCE_DIRECTORY(. DIR_SRCS)ADD_EXECUTABLE(main ${DIR_SRCS})

然后终端进入 Test文件夹根目录,执行如下指令:

$ mkdir build  #新建build目录,在build目录下编译可以使源文件免于干扰,便于编译文件的删改$ cd build  #进入build目录$ cmake ..  #执行上层目录中的CMakeLists.txt文件$ make      #编译整个项目

你会在终端中看到以下系统消息:

Make Result
说明编译 Compiling 和链接 Linking 都顺利完成了。接下来执行二进制文件即可。终端输入 ./main执行 main二进制文件。

显然,在单一目录下使用CMAKE编译工程是比较简单的。下面说明CMakeLists.txt文件的作用和语句的具体含义。

CMakeLists.txt 文件让程序员结构化地指定头文件和源文件的使用关系,让系统自动地生成项目的编译文件而无需程序员手动编写又长又复杂的编译指令。
上面测试项目中的 CMakeLists.txt 的语法说明如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  # 指定可使用CMAKE的最低版本PROJECT(TEST)                        # 指定项目的名称,系统会自动生成默认的二进制文件生成目录和源文件索引目录AUX_SOURCE_DIRECTORY(. DIR_SRCS)     # 指定在当前目录下查找源文件,并以列表的形式放入变量DIR_SRCS中保存ADD_EXECUTABLE(main ${DIR_SRCS})     # 指定编译出的二进制文件,使用的是变量DIR_SRCS中存储的所依赖的所有源文件

多目录工程的CMAKE配置与编译

如果工程目录下存在多个子目录,也不必惊慌。我们先模拟一个简单的多目录工程,新建一个工程文件夹 Test。根据如下结构建立相应的文件夹和文件:

Test    -- header        -- CMakeLists.txt        -- tools.cpp        -- tools.h    -- src        -- main.cpp    -- CMakeLists.txt

此时我们注意到,在 根目录 Test 和子目录 header 中都有 CMakeLists.txt 文件。这就是多目录工程使用CMAKE进行编译配置的关键点,接下来会有相应的解释。
大致的文件内容如下,我就直接在代码后注释中解释含义了:

根目录下的 CMakeLists.txt 文件如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)     # 指定要使用的CMAKE的最低版本PROJECT(TEST)                              # 指定项目的名称,一样会生成默认的变量存储相关信息ADD_SUBDIRECTORY(header)                   # 添加子文件夹header,此时CMAKE会去该子目录查找相应的CMakeLists.txt文件然后执行,最终会生成一个libTools.a的链接库供最后的链接Linking阶段使用AUX_SOURCE_DIRECTORY(./src DIR_SRCS)       # 既然main.cpp文件在src目录下,那么我们就指定去./src下查找二进制文件的源文件,并放入变量DIR_SRCS中存储ADD_EXECUTABLE(main ${DIR_SRCS})           # 指定二进制文件的输出信息,使用在./src目录下查找到的源文件生成TARGET_LINK_LIBRARIES(main Tools)          # 编译完成后,使用上面提到的libTools.a链接库完成相关函数的链接

从根目录中的CMakeLists.txt文件可以看出,对于一个对目录工程,CMAKE可以帮助我们自动地完成来自不同目录的文件之间的关联,这一点对于程序员来说无疑是巨大的帮助。

然后看一看具体子目录下的文件究竟写了啥。

子目录 header下的 CMakeLists.txt文件:

AUX_SOURCE_DIRECTORY(. DIR_TOOLS_SRCS)    # 将当前目录下的源文件信息存入变量DIR_TOOLS_SRCS中ADD_LIBRARY(Tools ${DIR_TOOLS_SRCS})      # ADD_LIBRARY命令会使用上述源文件生成一个链接库libTools.a,其他用法可以百度

头文件 tools.h 如下:

#ifndef _TOOLS_H#define _TOOLS_H#endif#include <iostream>using namespace std;void display();

源文件 tools.cpp 如下:

#include "tools.h"void display(){  cout<<"It works!"<<endl;}

子目录 src下的源文件 main.cpp 如下:

#include "../header/tools.h"int main(){  display();}

依旧,我们在根目录下创建 build 目录并在 build 目录下完成 cmake ..make 指令。最后在该目录下执行二进制文件即可。

当然我列举的工程和使用的相关指令都比较简单,遇到类似的情况可以依葫芦画瓢,遇到问题可以百度一下。
你也可以去看一看 IBM 公司提供的CMAKE相关教程。