如果更改了CMAKE_RUNTIME_OUTPUT_DIRECTORY,则CMake无法找到测试

 掌纹clear贡 发布于 2023-01-30 23:13

我正在用CMake构建我的项目,我正在尝试为每个模块创建一堆测试套件.显然,如果我修改变量,CMAKE_RUNTIME_OUTPUT_DIRECTORY那么ctest无法找到要运行的测试并失败.

我已经做了一个最小的例子来展示我正在谈论的内容,并且我在Lubuntu 13.10上使用CMake 2.8.11.2运行它.如果有人能告诉我这是一个错误和/或如何解决它,我会很感激.谢谢.

文件CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (Test)

# Put all tests in the test directory, where the sources also are
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/test)

enable_testing()

add_subdirectory (${PROJECT_SOURCE_DIR}/test)

文件测试/ CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

add_executable(ttest main.cpp)
add_test(ttest ttest)

file test/main.cpp:

int main() {
    return 0;
}

在新文件夹中构建后build,可在文件夹中正确创建可执行文件test.make test从build 运行会产生以下输出:

Running tests...
Test project /home/svalorzen/Tests/cmake/build
    Start 1: ttest
Could not find executable ttest
Looked in the following places:
ttest
ttest
Release/ttest
Release/ttest
Debug/ttest
Debug/ttest
MinSizeRel/ttest
MinSizeRel/ttest
RelWithDebInfo/ttest
RelWithDebInfo/ttest
Deployment/ttest
Deployment/ttest
Development/ttest
Development/ttest
Unable to find executable: ttest
1/1 Test #1: ttest ............................***Not Run   0.00 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.00 sec

The following tests FAILED:
      1 - ttest (Not Run)
Errors while running CTest
make: *** [test] Error 8

archz.. 21

编辑:

实际上我错过了文档中的内容add_test:

如果COMMAND指定可执行目标(由add_executable创建),它将自动替换为在构建时创建的可执行文件的位置

所以使用ttest而不是$应该工作.


我遇到了同样的问题,但我真的不知道它是不是一个bug.

我找到的解决方案是在命令中提供测试可执行文件的路径(使用目标ttest):

在test/CMakeLists.txt中:

add_test(ttest test/ttest)

最后,您希望将路径存储在变量中以便编写类似的内容${test_dir}/ttest.

如果你想要更强大的东西,最好是使用long add_test命令和生成器表达式:

add_test(NAME ttest COMMAND $)

生成表达式$将扩展到可执行目标的输出文件(此处为ttest),因此您可以确定目录没有问题.cmake文档中引用了其他表达式.

如果你有很多测试要声明,它会变得有点冗长,所以我使用像:

macro (create_test target)
  add_test (NAME ${target} COMMAND $)
endmacro (create_test)

#[some code]

#test definition
create_test(ttest)

假设测试名称与可执行文件名称相同.

我找不到任何其他有效的解决方案.可以设置工作目录add_test,这显然使ctest找到可执行文件但测试然后崩溃并出现"BAD_COMMAND"错误.

我是cmake的新手,所以可能还有另一个解决方案.

2 个回答
  • 编辑:

    实际上我错过了文档中的内容add_test:

    如果COMMAND指定可执行目标(由add_executable创建),它将自动替换为在构建时创建的可执行文件的位置

    所以使用ttest而不是$<TARGET_FILE:ttest>应该工作.


    我遇到了同样的问题,但我真的不知道它是不是一个bug.

    我找到的解决方案是在命令中提供测试可执行文件的路径(使用目标ttest):

    在test/CMakeLists.txt中:

    add_test(ttest test/ttest)
    

    最后,您希望将路径存储在变量中以便编写类似的内容${test_dir}/ttest.

    如果你想要更强大的东西,最好是使用long add_test命令和生成器表达式:

    add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)
    

    生成表达式$<TARGET_FILE:ttest>将扩展到可执行目标的输出文件(此处为ttest),因此您可以确定目录没有问题.cmake文档中引用了其他表达式.

    如果你有很多测试要声明,它会变得有点冗长,所以我使用像:

    macro (create_test target)
      add_test (NAME ${target} COMMAND $<TARGET_FILE:${target}>)
    endmacro (create_test)
    
    #[some code]
    
    #test definition
    create_test(ttest)
    

    假设测试名称与可执行文件名称相同.

    我找不到任何其他有效的解决方案.可以设置工作目录add_test,这显然使ctest找到可执行文件但测试然后崩溃并出现"BAD_COMMAND"错误.

    我是cmake的新手,所以可能还有另一个解决方案.

    2023-01-30 23:27 回答
  • 使用命令:

    add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)
    

    写作NAMECOMMAND在使用时是强制性的TARGET_FILE(或者至少它不适用于我.否则请使用cmake --help-command add_test以获取更多信息.

    2023-01-30 23:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有