CMake中include指令⽤法介绍
本⽂主要介绍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++标准版本指定
有时我们会有这样⼀种需求,在使⽤同⼀个外层 的前提下,每个源码⼦⽬录中要求使⽤的C++标准版本不同,有的源码要求使⽤c++98标准编译、有的源码要求使⽤c++11标准编译,这时我们就可以使⽤include指令来满⾜这样的需求了。
2.1.1 项⽬代码结构及内容
在这⾥,我们使⽤中的项⽬代码结构,并在其基础上做⼀些改动,改动后的项⽬代码结构如下:
相⽐于之前的项⽬代码结构,我们增加了“cmake_dir3”这个源码⽬录,同时,修改了最外层的。
cmake_dir3中包含的⽂件列表如下:
1. [root@node1 /opt/liitdar/mydemos/simples/cmake_test]# l cmake_dir3
2. total 8
3. -rw-r--r--. 1 root root 257 Jul 21 14:
4. -rw-r--r--. 1 root root 258 Jul 21 14:19 main.cpp
5. [root@node1 /opt/liitdar/mydemos/simples/cmake_test]#
其中,内容如下:
1. # 遍历当前路径下的所有源⽂件,并将其添加到变量DIR_SRCS中
2. aux_source_directory(. DIR_SRCS)
3.
4. # 添加名为cmake_test3的可执⾏⽂件,该⽂件会由变量DIR_SRCS中的源⽂件构建⽣成
5. add_executable(cmake_test3 ${DIR_SRCS})
main.cpp内容如下:
1. #include <iostream>
2. #include <string>
3.
4. using namespace std;
5.
6. int main()
7. {
8. int a = 100;
9. string strTest;
10.
1. strTest = to_string(a) + " is a string.";
12.
3. cout << "a is: " << a << endl;
cmake如何使用4. cout << "pszTest is: " << strTest << endl;
15.
6. return 0;
7. }
最外层的改动部分(新增了cmake_dir3源码⽬录)如下:
2.1.2 项⽬构建
此时,我们对上述项⽬使⽤CMake进⾏构建,如下:
从上图中可以看到,项⽬构建失败了,因为在cmake_dir3中存在“to_string”函数,该函数需要在c++11标准下进⾏编译,⽽默认使⽤的都是c++98标准。
2.1.3 解决⽅案
此时,我们就需要为cmake_dir3设置不同的c++标准进⾏编译了。具体步骤如下:
1. 我们在最外层的的同级⽬录下,增加⼀个⽂件set_ake,如下:
通过在最外层的中使⽤include指令引⼊该⽂件,我们就可以在源码⽬录中设置想要使⽤的c++标准了。
set_ake的内容如下:
1. # set c++ norm value, these values will be used for comparision later
2. set(CXX_NORM_CXX98 1) # C++98
3. set(CXX_NORM_CXX03 2) # C++03
4. set(CXX_NORM_CXX11 3) # C++11
5.
6. # Set the wanted C++ norm
7. # Adds the good argument to the command line in function of the compiler
8. macro(set_cxx_norm NORM)
9. # Extract c++ compiler --version output
0. exec_program(
1. ${CMAKE_CXX_COMPILER}
2. ARGS --version
3. OUTPUT_VARIABLE _compiler_output
4. )
5. # Keep only the first line
6. string(REGEX REPLACE
7. "(\n.*$)"
8. ""
9. cxx_compiler_version "${_compiler_output}"
0. )
1. # Extract the version number
2. string(REGEX REPLACE
3. "([^0-9.])|([0-9.][^0-9.])"
4. ""
5. cxx_compiler_version "${cxx_compiler_version}"
6. )
27.
8. # Set the specific C++ norm According 'NORM'
9. if(${NORM} EQUAL ${CXX_NORM_CXX98})
0. add_definitions("-std=c++98")
1. elseif(${NORM} EQUAL ${CXX_NORM_CXX03})
2. add_definitions("-std=c++03")
3. elseif(${NORM} EQUAL ${CXX_NORM_CXX11})
4. if(${cxx_compiler_version} VERSION_LESS "4.7.0")
5. add_definitions("-std=c++0x")
6. else()
7. add_definitions("-std=c++11")
8. endif()
9. endif()
40.
1. endmacro()
2. 然后,我们需要修改cmake_dir3的⽂件,新增“要使⽤c++11标准”的语句,如下:
1. # 使⽤c++11标准
2. set_cxx_norm(${CXX_NORM_CXX11})
完成上述修改后,再次进⾏项⽬构建,结果如下:
在上图中我们可以看到,项⽬构建成功了。此时,cmake_test1和cmake_test2使⽤的是c++98(默认)标准;⽽cmake_test3使⽤的是c++11标准。
运⾏cmake_test3程序,结果如下:
上⾯的运⾏结果表明,cmake_test3成功调⽤了c++11标准的“to_string”函数,将整型转换为字符串类型
了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论