多C++标准版本指定

本文主要介绍 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”函数,将整型转换为字符串类型了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL容器存储的内容动态分配情况下的内存管理

主要分两种情况&#xff1a;存储的内容是指针&#xff1b;存储的内容是实际对象。 看以下两段代码&#xff0c; typedef pair<VirObjTYPE, std::list<CheckID>*> VirObj_CheckID_pair;class LangChecker{public: LangChecker(); ~LangChecker(); voi…

一分二功率分配器_一文学会微波功率分配器

功率分配器是微波电路设计中常用的一个无源元器件&#xff0c;简称功分器&#xff0c;顾名思义&#xff0c;就是把一路输出功率按照一定的比例分配成N路功率输出的一种微波元器件&#xff0c;如下图所示&#xff0c;A端口进入的信号分成两路信号从C1和C2端口输出。当然&#xf…

MinGW编译boost库

介绍 在windows下编译boost可以选择msvc和mingw两种方式&#xff0c;这里介绍使用mingw方式编译,msvc也是类似的操作 源码下载 例如1.48.0http://www.boost.org/users/history/version_1_48_0.html 使用不同的版本时将version_1_48_0替换即可 编译 编译 b2.exe 进入boost…

软件工程——理论、方法与实践 第一章

第一章 主要分为1、软件2、软件工程3、软件工程知识体系4、软件工程职业道德规范四部分。软件是人类思维创造的杰作,并成为人类现代生活的催化剂;第一部分软件对软件的特性、发展和软件的危机进行了讲解&#xff0c;主要描述软件是计算机程序、规程以及运行计算机系统可能需要…

高德地图定位精度多少米_中美俄卫星定位精度分别是多少?美0.1米,俄10米,中国呢?...

在古代&#xff0c;悬于天际的北斗七星就被那时候的人们当做辨别方向的工具&#xff0c;在现代&#xff0c;太空之中的北斗卫星也在为人们指引方向&#xff0c;为了这一天的到来&#xff0c;我们等待了太久太久。1993年发生的银河号事件里&#xff0c;美国宣称我国商船携带了违…

find_path、find_library备忘录

find_path用于查找包含的头文件&#xff0c;其查找顺序为&#xff1a;从CMAKE_INCLUDE_PATH中查找。从系统默认头目录即/usr/include、/usr/local/inlucde中查找。其中如果从CMAKE_INCLUDE_PATH中查找的话&#xff0c;需要在~/.profile或者/etc/profile中设置&#xff08;注意&…

Android成长日记-Android布局优化

Android常用布局 1. LinearLayout(线性布局) 2. RelativeLayout(相对布局) 3. TableLayout(表格布局) 4. AbsoluteLayou(绝对布局) 5. FrameLayout(帧布局) 低--------------使用量------------------高 4->3->5->1->2 Android布局原则 (1) 尽量多使用LinearLayout…

练字格子纸模板pdf_a4田字格练字纸打印版-练字标准田字格模板-a4打印版下载最新免费excel版-西西软件下载...

练字标准田字格模板-a4打印版是一份a4田字格练字模板下载&#xff0c;硬笔书法练习田字格模板-标准A4打印版、标准田字格模板-每日练字、硬笔书法练习田字格模板-标准A4打印版、标准田字格模板-A4打印、硬笔书法练习田字格模板可以使用。word制作练字田字格1、点击word“表格”…

vcpkg

git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install./vcpkg install curl[tool] ./vcpkg.exe install pthreads:x64-windows

DB2 常用命令小结

1、 打开命令行窗口 #db2cmd 2、 打开控制中心 # db2cmd db2cc 3、 打开命令编辑器 db2cmd db2ce 操作数据库命令 4、 启动数据库实例 #db2start 5、 停止数据库实例 #db2stop 如果你不能停止数据库由于激活的连接&#xff0c;在运行db2stop前执行db2 force application all…

以字符串形式打印宏值

#define PI 3.141592654 #define xstr(s) str(s) #define str(s) #s int main() {string str1 xstr(PI);const char* str2 xstr(PI);cout << str1 << endl;cout << str2 << endl; }

解决cocos2dx调用removeFromParent后报错问题

原因&#xff1a;cocos2dx的bug 解决办法&#xff1a; 放到action中&#xff0c;前面添加一个DelayTime延迟&#xff0c;代码如下 this->runAction(Sequence::create(DelayTime::create(0.1f),CallFuncN::create([&](Node* pNode){pNode->removeFromParent();}),NULL…

常量缓存与integer比较_吊打面试官系列:说说Integer缓存范围

本文主要大致思路为&#xff1a;不管从工作中还是面试&#xff0c;这篇文章都应该好好看完&#xff0c;本人认为是非常有用的。案例Integer是基本类型int的封装类。平时不管是入坑多年的小伙伴还在入坑路上的小伙伴&#xff0c;都应该知道的使用频率是相当高。下面模仿订单支付…

使用BIND安装智能DNS服务器(一)---基本的主从DNS服务器搭建

参考网址&#xff1a;http://www.unixmen.com/dns-server-installation-step-by-step-using-centos-6-3/   DNS(Domain Name System) 将主机名或者URLS翻译成IP地址。 例如&#xff1a;如果在浏览器输入网址 "www.unixmen.com" DNS server 将把这个域名翻译成和他…

openflow交换机 ryu_关于OpenFlow协议

SDN中两个重要元素&#xff1a;控制器(掌控全局&#xff0c;指挥网络内的设备工作)交换机(转发数据)控制器与网络设备通过OpenFlow协议进行通信OpenFlow交换机内有一个FlowTable&#xff0c;交换机按照流表转发数据&#xff0c;流表由控制器生成和维护。内有数据包匹配特征和数…

QT 语言切换

1. 代码里面需要切换语言的文字用tr包裹 2. 在工程pro文件目录下 3. 使用QT安装目录下的 Linguist程序增加中文字符串 4. 打开命令行 5. 执行 lrelease.exe ......\translations\zh_CN.ts

excel条形码字体_在Excel中批量生成条形码,竟如此简单!

条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息&#xff0c;因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。那么如何在Excel中快速生成条形码呢&#xff1f;我们以前看到的方法有&am…

(视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线代码编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定...

本文是《快速创建网站》系列的第6篇&#xff0c;如果你还没有看过之前的内容&#xff0c;建议你点击以下目录中的章节先阅读其他内容再回到本文。 访问本系列目录&#xff0c;请点击&#xff1a;http://devopshub.cn/tag/wordpress-on-azure/ 1. 网站管理平台WordPress和云计算…

自定义外部协议使浏览器拉起本地程序

什么是自定义协议 由于我们的游戏需要在浏览器中调用NPAPI插件&#xff0c;而chrome移除了NPAPI的支持&#xff0c;导致游戏并不能很好的适配所有的浏览器&#xff0c;所以这个时候我们对于chrome浏览器用到了自定义浏览器协议这一标准。自定义浏览器协议允许在浏览器中使用pr…

hssfcolor 不建议使用_不建议使用微信双开的真正原因!

不少小伙伴都有两个甚至多个微信号&#xff0c;通常一个是自己的私人号&#xff0c;其它则用于工作&#xff0c;所以想要在手机中双开微信&#xff0c;这样使用起来更方便。不过使用 iPhone 的小伙伴就很郁闷了&#xff0c;为什么在 iPhone 上不能像部分安卓手机那样方便的双开…