首页 > 其他分享 >CMake 教程(五):安装和测试

CMake 教程(五):安装和测试

时间:2024-09-23 18:21:18浏览次数:9  
标签:do 教程 CMake MathFunctions add 测试 test Tutorial

通常,只构建出可执行程序是不够的,还需要能够安装可执行程序。在 CMake 中,我们可以使用 install() 指令指明安装规则。这条指令能够用来指明安装的程序、位置和文件。

本节使用的源代码材料是官网的 Step5 目录。下面开始本节的练习。

练习1:安装规则(Install Rules)

本项目的安装规则如下:

  • 对于 MathFunctions,需要将库和头文件分别安装到 libinclude 目录当中。
  • 对于 Tutorial 可执行文件,需要把可执行文件和配置头文件分别安装到 bininclude 目录当中。

首先,修改 MathFunctions/CMakeLists.txt 文件:

set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
  list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs} DESTINATION lib)

install(FILES MathFunctions.h DESTINATION include)

上面指令的文字翻译:
• 首先,定义了一个要安装的目标库列表 installable_libs,包含 MathFunctionstutorial_compiler_flags
• 然后,判断是否存在名为 SqrtLibrary 的目标,如果存在,将它追加到 installable_libs 中。
• 最后,将 installable_libs 列表中的所有目标安装到 lib 目录下。

在顶层目录的 CMake 文件,我们需要做出如下修改:

install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
  DESTINATION include
  )

构建和安装

接下来,我们使用带有 --install 选项的 cmake 指令安装。

  • cmake --install .:会把头文件、库和可执行文件安装到合适的目录当中,通常是系统目录:
    使用 cmake 指令安装程序时,需要以 sudo 权限。否则,会报出复制文件权限不足的错误。
    在这里插入图片描述
    或者,我们在使用 cmake 命令时,指定安装的目录为不需要 sudo 权限就可以写的目录。
    使用命令:
cmake --install . --prefix  "/home/coder/installdir/"

执行结果如下:
在这里插入图片描述
在这里插入图片描述

  • cmake --install . --config Release:对于多配置工具,需要用参数 --config 指明配置。

练习2:测试支持(Testing Support)

题解步骤

CTest 为项目提供了测试支持。可以通过 add_test() 指令添加测试。本节练习我们使用 CTest 编写简单的测试用例,需要完成 TODO5TODO9

首先,我们需要启用测试。然后,使用 add_test() 指令添加几条简单的测试。下面是详细的步骤说明。

在顶层的 CMakeLists.txt 文件当中,需要我们启用测试:

enable_testing()

然后,添加几个基本的测试用以验证应用程序能够正确地运行。首先,添加一条测试,这条测试以参数 25 运行可执行文件 Tutorial。我们并不打算用这条测试验证程序的计算结果。该测试只是用来验证程序可以正常运行,例如不会发生段错误或者其他的崩溃。

add_test(NAME Runs COMMAND Tutorial 25)

接着,使用 PASS_REGULAR_EXPRESSION 测试属性来验证测试的输出包括了必要的字符串。在本例中,当提供了不正确的参数时,应该打印用法信息。

add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
  )

插播介绍一下上面两条指令的含义。

  1. add_test(NAME StandardUse COMMAND Tutorial 4)

    add_test() 是 CMake 中用于添加测试的命令。
    NAME StandardUse:给这个测试命名为 StandardUse,这个名字会在后续调用测试时使用。
    COMMAND Tutorial 4:指定测试时运行的命令。在这个例子中,命令是运行 Tutorial 程序,并传递参数 4。也就是说,运行 Tutorial 4 这个命令。

  2. set_tests_properties(StandardUse PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2")

    set_tests_properties() 用于为特定测试设置属性。
    StandardUse:这是要设置属性的测试的名称(在这里就是前面定义的 StandardUse 测试)。
    PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2":这是为测试指定属性,PASS_REGULAR_EXPRESSION 表示通过测试的正则表达式。这意味着该测试的输出中必须包含字符串 “4 is 2”,否则测试会失败。

下一步需要验证的是程序的计算值等于它的真正的平方根。

add_test(NAME StandardUse COMMAND Tutorial 4)
set_tests_properties(StandardUse
  PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2"
  )

当然仅仅编写这几个测试是远远不够的。为了容易地添加更多的测试,写了一个叫做 do_test() 的函数,用来运行应用程序并验证给定输入平方根的值是否正确。do_test() 函数是在 cmake 文件当中定义的,函数的参数是名称、输入和期望的结果。

function(do_test target arg result)
  add_test(NAME Comp${arg} COMMAND ${target} ${arg})
  set_tests_properties(Comp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result}
    )
endfunction()

# do a bunch of result based tests
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is (-nan|nan|0)")
do_test(Tutorial 0.0001 "0.0001 is 0.01")

构建和运行

进入到 Step5_build 目录并重新构建程序。接着,运行 ctest 可执行文件:ctest -Nctest -VV。对于多配置的生成器(例如:Visual Studio),配置类型必须用 -C <mode> 指定。例如,以 Debug 模式运行所有的测试,在 build 目录需要使用命令 ctest -C Debug -VV。发行模式需要在 build 目录使用 -C Release
ctest -N 可以用来查看都有哪些测试:
在这里插入图片描述
ctest -VV 用来运行所有测试,与此同时,输出每次测试的详细信息:
在这里插入图片描述
执行 ctest 会得到所有测出的执行结果:
在这里插入图片描述
如果只想执行某个测试用例,可以使用命令 ctest -R 测试用例名,例如 ctest -R Comp9
在这里插入图片描述

最后,放上本文修改后的 CMake 文件。
顶层的 CMake 文件:

cmake_minimum_required(VERSION 3.15)

# set the project name and version
project(Tutorial VERSION 1.0)

# specify the C++ standard
add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

# add compiler warning flags just when building this project via
# the BUILD_INTERFACE genex
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
target_compile_options(tutorial_compiler_flags INTERFACE
  "$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>"
  "$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)

# configure a header file to pass some of the CMake settings
# to the source code
configure_file(TutorialConfig.h.in TutorialConfig.h)

# add the MathFunctions library
add_subdirectory(MathFunctions)

# add the executable
add_executable(Tutorial tutorial.cxx)

target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)

# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

# TODO 3: Install Tutorial in the bin directory
# Hint: Use the TARGETS and DESTINATION parameters
# Target后跟要安装的目标,DESTINATION后跟安装到的目录
install(TARGETS Tutorial DESTINATION bin)
# TODO 4: Install TutorialConfig.h to the include directory
# Hint: Use the FILES and DESTINATION parameters
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
        DESTINATION include)
# TODO 5: Enable testing
enable_testing()
# TODO 6: Add a test called Runs which runs the following command:
# $ Tutorial 25
add_test(NAME Runs COMMAND Tutorial 25)
# TODO 7: Add a test called Usage which runs the following command:
# $ Tutorial
# Make sure the expected output is displayed.
# Hint: Use the PASS_REGULAR_EXPRESSION property with "Usage.*number"
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
  )
# TODO 8: Add a test which runs the following command:
# $ Tutorial 4
# Make sure the result is correct.
# Hint: Use the PASS_REGULAR_EXPRESSION property with "4 is 2"
add_test(NAME StandardUse COMMAND Tutorial 4)
set_tests_properties(StandardUse
  PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2"
  )
# TODO 9: Add more tests. Create a function called do_test to avoid copy +
# paste. Test the following values: 4, 9, 5, 7, 25, -25 and 0.0001.
function(do_test target arg result)
  add_test(NAME Comp${arg} COMMAND ${target} ${arg})
  set_tests_properties(Comp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result}
    )
endfunction()

# do a bunch of result based tests
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is (-nan|nan|0)")
do_test(Tutorial 0.0001 "0.0001 is 0.01")

MathFunctions 目录下 CMake 文件:

add_library(MathFunctions MathFunctions.cxx)

# state that anybody linking to us needs to include the current source dir
# to find MathFunctions.h, while we don't.
target_include_directories(MathFunctions
                           INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                           )

# should we use our own math functions
option(USE_MYMATH "Use tutorial provided math implementation" ON)
if (USE_MYMATH)
  target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")

  # library that just does sqrt
  add_library(SqrtLibrary STATIC
              mysqrt.cxx
              )

  # link SqrtLibrary to tutorial_compiler_flags
  target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags)

  target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()

# link MathFunctions to tutorial_compiler_flags
target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)

# TODO 1: Create a variable called installable_libs that is a list of all
# libraries we want to install (e.g. MathFunctions and tutorial_compiler_flags)
# Then install the installable libraries to the lib folder.
# Hint: Use the TARGETS and DESTINATION parameters
set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
  list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs} DESTINATION lib)
# TODO 2: Install the library headers to the include folder.
# Hint: Use the FILES and DESTINATION parameters
install(FILES MathFunctions.h DESTINATION include)

标签:do,教程,CMake,MathFunctions,add,测试,test,Tutorial
From: https://blog.csdn.net/combination1379/article/details/142366895

相关文章

  • python 自动化接口测试
                  ......
  • 网易126邮箱自动化测试
    网易126邮箱自动化测试项目介绍项目简介测试地址项目设计设计测试用例环境准备与使用工具工具:环境:目录结构代码实现common包下的创建Chrome浏览器web驱动对象并进行封装tests包下的页面功能测试注册功能手动测试登录功能账号正确,密码正确可以正常退出登录未注册直接登......
  • 优化 Go 语言数据打包:性能基准测试与分析
    优化Go语言数据打包:性能基准测试与分析场景:在局域网内,需要将多个机器网卡上抓到的数据包同步到一个机器上。原有方案:tcpdump-w写入文件,然后定时调用rsync进行同步。改造方案:使用Go重写这个抓包逻辑及同步逻辑,直接将抓到的包通过网络发送至服务端,由服务端写入,这样就减少......
  • Go 语言编程极简教程 2
    Go语言编程极简教程2我将为您提供一个Go语言编程的极简教程。我会尽量详细地解释每个步骤,并探讨多种方法来介绍这个主题。让我们开始吧!文章目录Go语言编程极简教程2介绍Go语言安装Go语言环境创建第一个Go程序解释Go程序结构Go语言的基本数据类型变量声......
  • CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!
        一、CTF简介CTF(CaptureTheFlag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行......
  • 如何确定性能测试指标
    知识星球有同学问了这样一个问题:开展了一次压测,但不知道如何筛选性能测试报告中的性能指标。需求里没有提到明确的技术指标,测试报告中需要说明被测服务的CPU、内存使用率数据吗?压测机集群的负载情况,是否需要说明?很典型的一个和性能测试有关的问题,也是很多性能测试小白比较......
  • 正则表达式教程:验证车牌号(新能源+非新能源)
     一、正则解释正则表达式:/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/说明:^表示开头。[和]表示字符类。[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使......
  • Adobe Illustrator AI v28.6 解锁版下载及安装教程 (矢量图形设计软件)
    前言AdobeIllustrator(简称AI)专业矢量图形设计软件,矢量绘图设计工具,设计师常用的矢量绘制软件。该软件广泛应用于广告设计、印刷出版、海报书籍、插画绘制、图像处理、PDF文档设计、WEB页面等设计,借助这款矢量绘图工具,可以制作适用于印刷,Web,视频和移动设备的徽标、图标、绘图、......
  • 苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,
    年份2024    基础:Javase  Javaweb已完结   2024  8.25---9.14  20天Day-01   8.25今天开始学习已经晚了,网盘下载了一下文件,做了一些开始项目的准备工作。本来其实打算用notepad++来写学习日志的,但是那个传不了图片,而且编辑视图没有这......
  • windows下UDP端口测试
    1、下载netcat下载地址:https://eternallybored.org/misc/netcat/2、安装netcat解压之后,把安装包配置到环境变量中去3、UDP端口测试 4、需要注意的问题 ......