【问题标题】:CMake : Executable crashes when running ctestCMake:运行 ctest 时可执行文件崩溃
【发布时间】:2016-01-14 16:24:44
【问题描述】:

我正在 Windows 上为 MSVC++ 项目配置 CMake 构建项目。它构建了可执行文件,然后将其安装到定义的目录中。在我的情况下是:

${CMAKE_SOURCE_DIR}/x64/${CMAKE_BUILD_TYPE}/

可执行文件在同一目录中有一个文件夹,其中包含它在启动时加载的文件。如果我手动启动 .exe,它会打开并运行正常。但我想通过 ctest 来完成。 我这样定义 ctest:

add_test(ENGINE_TEST1 ${CMAKE_SOURCE_DIR}/x64/${CMAKE_BUILD_TYPE}/MyApp.exe 
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/x64/${CMAKE_BUILD_TYPE})

当我从 cmd 调用时:

ctest

可执行文件正在启动,但立即崩溃并出现错误:

调试错误!

程序:../../.../MyApp.exe

R6010 -abort() 有

被调用。

确实,在检查 CMake 的 Last Test.log 文件时,它显示它不是在“WORKING_DIRECTORY 而是在 CMake 构建 MyApp.exe 的目录中运行测试。我该如何更改?

【问题讨论】:

  • 注意阅读documentation for add_test:要使用 WORKING_DIRECTORY 选项,您需要将 NAME 选项用于名称和 COMMAND - 用于命令。 add_test 的短版不接受 WORKING_DIRECTORY 选项。
  • 加长版本的 add_test 还抱怨缺少配置,从文档中不清楚如何设置。我终于通过单独设置 WORKING_DIRECTLY 解决了。
  • 如果您发布您的解决方案,将会对其他人(例如我)有所帮助。

标签: c++ cmake ctest


【解决方案1】:

由于我不是 CMake 专业人士,我确信以下答案不是最佳方法,但至少它对我有用。 同样,我试图从 cmake 安装它的目录中的可执行文件上运行 ctest。启动时的 exe 试图加载位于同一目录中的依赖文件。但它崩溃了,因为它无法完成文件。 看来 cmake 默认工作区目录是生成 cmake 文件和项目的目录。那是“构建”目录。因此,当通过 ctest 启动可执行文件时,它会搜索要加载的文件相对于构建目录的路径。 现在,CMAKE 有两种add_test() 方法的变体。一种很简单,带参数:

 add_test([test_name]  [test exe path])

它不处理工作目录。

另一个explained here 确实包含一个用于显式设置工作目录的参数。

坦率地说,我无法使用这个高级功能,因为它需要提供一些我不明白如何设置的测试.config。所以我做了什么,我使用了简单的 add_test 功能。 然后我将工作目录设置为我的可执行文件的位置:

 set_tests_properties(mytest PROPERTIES WORKING_DIRECTORY "${TEST_WOKRING_DIR}")

它解决了这个问题。

【讨论】:

  • 感谢您的回答。到目前为止,我已经能够确保我的测试从构建或安装它们的目录运行,因此我不需要指定工作目录。如果/当我需要相同的功能时,我会为您的答案添加书签。至于 add_test 命令的配置选项,文档表明它是可选的,因此您应该可以将其省略。我认为该选项允许您使用CONFIGURATIONS Release 将测试限制为仅在使用ctest -C Release 测试发布版本时运行,这在DEBUG 单元测试时间过长时很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多