我正在用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)
Run Code Online (Sandbox Code Playgroud)
文件测试/ CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
add_executable(ttest main.cpp)
add_test(ttest ttest)
Run Code Online (Sandbox Code Playgroud)
file test/main.cpp:
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在新文件夹中构建后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
Run Code Online (Sandbox Code Playgroud)
arc*_*chz 21
实际上我错过了文档中的内容add_test
:
如果COMMAND指定可执行目标(由add_executable创建),它将自动替换为在构建时创建的可执行文件的位置
所以使用ttest
而不是$<TARGET_FILE:ttest>
应该工作.
我遇到了同样的问题,但我真的不知道它是不是一个bug.
我找到的解决方案是在命令中提供测试可执行文件的路径(使用目标ttest):
在test/CMakeLists.txt中:
add_test(ttest test/ttest)
Run Code Online (Sandbox Code Playgroud)
最后,您希望将路径存储在变量中以便编写类似的内容${test_dir}/ttest
.
如果你想要更强大的东西,最好是使用long add_test命令和生成器表达式:
add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)
Run Code Online (Sandbox Code Playgroud)
生成表达式$<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)
Run Code Online (Sandbox Code Playgroud)
假设测试名称与可执行文件名称相同.
我找不到任何其他有效的解决方案.可以设置工作目录add_test
,这显然使ctest找到可执行文件但测试然后崩溃并出现"BAD_COMMAND"错误.
我是cmake的新手,所以可能还有另一个解决方案.
使用命令:
add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)
Run Code Online (Sandbox Code Playgroud)
写作NAME
并COMMAND
在使用时是强制性的TARGET_FILE
(或者至少它不适用于我.否则请使用cmake --help-command add_test
以获取更多信息.