本文主要介绍 CMake 中 include 指令的相关知识。

1 概述
引用 CMake 官网对于 include 指令的介绍,如下:

Load and run CMake code from a file or module.

include 指令的用法如下:

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
Load and run CMake code from the file given. Variable reads and writes access the scope of the caller (dynamic scoping). If OPTIONAL is present, then no error is raised if the file does not exist. If RESULT_VARIABLE is given, the variable will be set to the full filename which has been included or NOTFOUND if it failed.

If a module is specified instead of a file, the file with name <modulename>.cmake is searched first in CMAKE_MODULE_PATH, then in the CMake module directory. There is one exception to this: if the file which calls include() is located itself in the CMake builtin module directory, then first the CMake builtin module directory is searched and CMAKE_MODULE_PATH afterwards. See also policy CMP0017.

See the cmake_policy() command documentation for discussion of the NO_POLICY_SCOPE option.

2 作用
从前面所述,可知 include 指令用来载入并运行来自于文件或模块的 CMake 代码。

在这里针对一些具体的问题场景,介绍 include 指令的具体用法。

2.1 多C++标准版本指定
有时遇到这样一种需求,在使用同一个外层 CMakeLists.txt 的前提下,每个源码子目录中要求使用的 C++ 标准版本不同,有的源码要求使用 C++98 标准编译、有的源码要求使用 C++11 标准编译,这时就可以使用 include 指令来满足该需求。

2.1.1 项目代码结构及内容
此处使用《CMake介绍及其用法示例》中的项目代码结构,并在其基础上做一些改动,改动后的项目代码结构如下:

相比于之前的项目代码结构,这里新增了“cmake_dir3”这个源码目录,同时,修改了最外层的  CMakeLists.txt。

cmake_dir3 目录中包含的文件列表如下:

[root@node1 /opt/liitdar/mydemos/simples/cmake_test]# l cmake_dir3
total 8
-rw-r--r--. 1 root root 257 Jul 21 14:19 CMakeLists.txt
-rw-r--r--. 1 root root 258 Jul 21 14:19 main.cpp
[root@node1 /opt/liitdar/mydemos/simples/cmake_test]# 
其中,CMakeLists.txt 内容如下:

# 遍历当前路径下的所有源文件,并将其添加到变量DIR_SRCS中
aux_source_directory(. DIR_SRCS)
 
# 添加名为cmake_test3的可执行文件,该文件会由变量DIR_SRCS中的源文件构建生成
add_executable(cmake_test3 ${DIR_SRCS})
源码文件 main.cpp 内容如下:

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    int a = 100;
    string strTest;
 
    strTest = to_string(a) + " is a string.";
 
    cout << "a is: " << a << endl;
    cout << "pszTest is: " << strTest << endl;
 
    return 0;
}
最外层的 CMakeLists.txt 改动部分(新增了 cmake_dir3 源码目录)如下:

2.1.2 项目构建
对上述项目使用 CMake 进行构建,过程信息如下:

通过上图可以看到,项目构建失败了,因为在 cmake_dir3 中存在“to_string”函数,该函数需要在 C++11 标准下进行编译,而项目默认使用的是 C++98 标准。

2.1.3 解决方案
此时,就需要为 cmake_dir3 设置不同的 C++ 标准进行编译了。具体步骤如下:

1. 在最外层的 CMakeList.txt 的同级目录下,增加一个文件 set_cxx_norm.cmake,如下:

文件 set_cxx_norm.cmake 的内容如下:

# set c++ norm value, these values will be used for comparision later
set(CXX_NORM_CXX98 1)   # C++98
set(CXX_NORM_CXX03 2)   # C++03
set(CXX_NORM_CXX11 3)   # C++11
 
# Set the wanted C++ norm
# Adds the good argument to the command line in function of the compiler
macro(set_cxx_norm NORM)
    # Extract c++ compiler --version output
    exec_program(
        ${CMAKE_CXX_COMPILER}
        ARGS --version
        OUTPUT_VARIABLE _compiler_output
    )
    # Keep only the first line
    string(REGEX REPLACE
        "(\n.*$)"
        ""
        cxx_compiler_version "${_compiler_output}"
    )
    # Extract the version number
    string(REGEX REPLACE
        "([^0-9.])|([0-9.][^0-9.])"
        ""
        cxx_compiler_version "${cxx_compiler_version}"
    )
 
    # Set the specific C++ norm According 'NORM'
    if(${NORM} EQUAL ${CXX_NORM_CXX98})
        add_definitions("-std=c++98")
    elseif(${NORM} EQUAL ${CXX_NORM_CXX03})
        add_definitions("-std=c++03")
    elseif(${NORM} EQUAL ${CXX_NORM_CXX11})
        if(${cxx_compiler_version} VERSION_LESS "4.7.0")
            add_definitions("-std=c++0x")
        else()
            add_definitions("-std=c++11")
        endif()
    endif()
 
endmacro()
2. 然后,通过修改最外层的 CMakeLists.txt,使用include指令引入 set_cxx_norm.cmake 文件,这样就可以在源码目录中设置想要使用的 C++ 标准了。CMakeList.txt 中新增的 include 指令如下:

3. 最后,修改 cmake_dir3 的 CMakeLists.txt 文件,新增“要使用C++11标准”的语句,如下:

# 使用C++11标准
set_cxx_norm(${CXX_NORM_CXX11})
完成上述修改后,再次进行项目构建,结果如下:

通过上图能够知道,项目构建成功了。此时,cmake_test1 和 cmake_test2 使用的是 C++98(默认)标准;而 cmake_test3 使用的是 C++11 标准。

运行 cmake_test3 程序,运行结果如下:

上面的运行结果表明,cmake_test3 成功调用了 C++11 标准的“to_string”函数,将整型转换为字符串类型了。

多C++标准版本指定相关推荐

  1. 聊天记录 --- 如何维护标准版本以及N个拓展版本

    如何维护标准版本以及N个拓展版本? 总结: 使用git来进行版本控制,里面有cherrypick的功能.还有项目开发做到组件化,把通用组件放到公司的maven仓库. 聊天记录: 广州 - D(1962 ...

  2. linux滚动升级版本,Linux发行基础滚动版本与标准版本 | MOS86

    Linux发行版倾向于使用两种不同类型的发行周期.:标准版本和滚动版本.有些人通过滚动版本来发誓拥有最新的软件,而其他人喜欢标准版本更稳定和测试. 这是一些发行版发布常规标准版本,并为其不稳定的开发版 ...

  3. SpringCloud微服务架构标准版本拓扑图

    本图是公司需要,自己整理的SpringCloud微服务架构标准版本拓扑图,有.eddx格式(需要请私信),为了方便截了个jpg,希望对你有所帮助,喜欢的朋友点赞收藏转发!

  4. 发布JNCIP考试标准版本JUNOS实验用虚拟机

    发布JNCIP考试标准版本JUNOS实验用虚拟机 ITAA 汤姆一通 JNCIP试验标准平台 Dynamips与Olive的出现大幅度降低了很多希望学习高端网络技术,但却缺乏硬件实验条件练习的朋友之困 ...

  5. Python多个版本指定如何指定

    1.指定python3 32bit 版本安装SciPy库 py -3-32 -m pip install SciPy 2.指定python2 64bit 版本安装SciPy库 py -2-64 -m ...

  6. Mac升级go版本(指定或最新)

    升级流程 在Mac中对go版本的升级采用先卸载后安装的过程进行go版本升级(或者回退). 卸载 在卸载前,先查看下当前的go版本: go version 删除 go 目录: sudo rm -rf / ...

  7. OGC PUCK协议标准版本v1.4 翻译

    OGC PUCK协议用于支持IOT中设备的即插即用,其定义了自动获取设备元数据的相关方法,懂的自然懂,多说无益. 最近我在实现IP PUCK.顺带将这个协议的文档整个翻译了一遍.PUCK的部分已经实现 ...

  8. npm 更新升级(最新版本 | 指定版本)

    查看 npm 当前版本 $ npm -v 更新到最新版本 $ npm install -g npm 更新到指定版本 $ npm -g install npm@6.8.0 清理 npm 缓存数据 $ n ...

  9. 服务器维修质保合同,服务器维护保修合同(标准版本).pdf

    服务器维护保修合同 甲 方 : 乙 方 : . 服务器维护保修合同 甲 方: 住 所: 法定代表人: 联 系 电 话 : 传 真: 联 系 地 址 : 邮 政 编 码 : 乙 方: 住 所: 法定代表 ...

最新文章

  1. “去中心化”为何意义重大?
  2. LVS/HAProxy/Nginx负载均衡对比
  3. Linux内核学习--内存管理模块
  4. 始化mysql系统库_安装和初始化mysql-8.0.11-winx64
  5. 基于 Jenkins 快速搭建持续集成环境--转
  6. 巧用ActionFilter的AOP特性,为返回的数据增加返回码和消息
  7. android aop静态方法,spring aop 不能对静态方法进行增强解决
  8. Leetcode每日一题:56. I. 数组中数字出现的次数
  9. 【5分钟 Paper】Deterministic Policy Gradient Algorithms
  10. [Specification by Example][ch5 Deriving scope from goals]-[读书笔记]-[4]
  11. wps linux 64 下载,WPS For Linux 10.1.0.6757社区版发布下载
  12. 欧姆龙NX系列PLC和工业软件的搜集资料
  13. html 车牌号输入代码,html中车牌号省份简称输入键盘的示例代码(3)
  14. 弘辽科技:掌握淘宝直通车的工作原理很有必要!其核心是什么?
  15. 网站服务器的宽带是1mb是什么意思,1mb/s网速是什么意思
  16. 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)考试试卷
  17. Xavier(2):Xavier NX刷机步骤及报错解决
  18. np.savetxt()和np.loadtxt()
  19. useReducer
  20. mysql ignore详解_MySQL replicate-ignore-db详解

热门文章

  1. mpvue 从零开始 女友拉黑了我 5 不在以下request 合法域名列表中,请参考文档
  2. 哪里有mysql认证_国内哪个城市可以考mysql认证
  3. java apk安装路径_android apk安装过程源码解析
  4. linux识别UDF文件系统吗,Linux Kernel UDF文件系统本地缓冲区溢出漏洞
  5. java核心-多线程-Java多线程编程涉及到包、类
  6. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
  7. murmurhash
  8. [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq
  9. 矩阵快速幂 HDU3483
  10. 用yum安装完mysql后没有mysqld的问题