【问题标题】:CMake: How to specify directory where ctest should look for executables?CMake:如何指定 ctest 应在其中查找可执行文件的目录?
【发布时间】:2017-10-14 09:13:54
【问题描述】:

我想将 ctest 集成到 c++/c 项目中。我使用谷歌测试来编写单元测试。

我的 CMakeLists.txt 的相关部分如下所示:

...
####### CREATING EXE #######
add_executable(test_exe main.cpp test.cpp)
target_link_libraries(test_exe GTest::GTest GTest::Main)
set_target_properties (test_exe PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${UNIT_TEST_BIN_OUTPUT_DIR})
add_test(test_exe test_exe)

如您所见,我指定了可执行文件的输出目录 (UNIT_TEST_BIN_OUTPUT_DIR)。

当我使用终端时,可执行文件本身可以正常工作:

cd <UNIT_TEST_BIN_OUTPUT_DIR>
./test_exe

我想使用 ctest 来执行我的测试。所以我去cmake生成的“ctest文件夹”。这里我想用ctest来执行cmake中“add_test”添加的所有测试。

user@user:~/<dir to cmake>/cmake/unit_tests$ ctest
Test project /<dir to cmake>/cmake/unit_tests
    Start 1: test_exe
Could not find executable test_exe
Looked in the following places:
test_exe
test_exe
Release/test_exe
Release/test_exe
Debug/test_exe
Debug/test_exe
MinSizeRel/test_exe
MinSizeRel/test_exe
RelWithDebInfo/test_exe
RelWithDebInfo/test_exe
Deployment/test_exe
Deployment/test_exe
Development/test_exe
Development/test_exe
Unable to find executable: test_exe
1/1 Test #1: test_exe ......***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 - test_exe (Not Run)
Errors while running CTest

如果我将“test_exe”放在显示的路径之一中,它可以正常工作。但我不希望他们在那里。

我的问题:

有没有办法告诉 ctest 它应该在 UNIT_TEST_BIN_OUTPUT_DIR 中查找才能找到可执行文件?

【问题讨论】:

    标签: c++ cmake googletest ctest


    【解决方案1】:

    Documentation for add_test 为命令的 长格式 指定 WORKING_DIRECTORY 选项。该选项的值作为test运行的目录:

    add_test(NAME test_exe COMMAND test_exe WORKING_DIRECTORY ${UNIT_TEST_BIN_OUTPUT_DIR})
    

    如果你只是想让测试找到可执行文件,使用就足够了

    add_test(NAME test_exe COMMAND test_exe)
    

    这是add_test 命令的长格式。在这种形式中,CMake 检查 COMMAND 是否是 target 名称,如果是,则将其替换为对应于该目标的可执行文件的绝对路径。这样测试可以从任何目录运行。

    请注意,自动替换目标不适用于您使用的add_test短格式

    【讨论】:

    • 这看起来是一个合适的解决方案!我现在使用add_test(NAME test_exe COMMAND test_exe WORKING_DIRECTORY ${UNIT_TEST_BIN_OUTPUT_DIR}),效果很好。谢谢!
    • 请注意,即使插入了完整路径,工作目录也不会在您的第二个 sn-p 中更改。如果测试可执行文件使用相对路径,这一点很重要。
    • @typ1232:感谢您的评论。我已经改写了帖子。现在应该清楚第二个示例没有设置工作目录。
    • 我遇到了同样的问题,只需要明确指定参数 NAME 和 COMMAND。
    【解决方案2】:

    使用 CMake 3.20 及更高版本,您可以使用 CLI option 告诉 CTest 哪个目录包含您的测试:

    ctest --test-dir /path/to/your/tests
    

    对于现有测试,这是一种侵入性较小的解决方案,您不想修改 CMake 文件。

    【讨论】:

    • 可惜我还在 3.16 :x
    【解决方案3】:

    在我们的项目中,我们总是在调用 add_test() 时指定路径,例如:

    add_test( ${filename}  ${CMAKE_CURRENT_BINARY_DIR}/${filename} )
    

    【讨论】:

    • 我不知道这是否是最好的方法,但它确实为我解决了这个问题!非常感谢!工作很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多