Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CMake生成的系统在构建时运行Google测试_C++_Visual Studio_Unit Testing_Cmake_Googletest - Fatal编程技术网

C++ 使用CMake生成的系统在构建时运行Google测试

C++ 使用CMake生成的系统在构建时运行Google测试,c++,visual-studio,unit-testing,cmake,googletest,C++,Visual Studio,Unit Testing,Cmake,Googletest,我的配置有CMake 3.6、Visual Studio 2015和GitHub的最新Google测试。我通过一个cmake函数添加单元测试,然后进行构建。在此之后,我可以从我的run\u TESTStarget运行测试,或者在VS中使用ctrl+F5并按预期工作 最终目标是使用CMake依赖关系管理在构建时运行单元测试。现在,作为第一步,我已经增强了我的功能,创建了一个自定义\u目标(包括整个功能,以防工作部分中出现不可预见的问题),但没有构建它: function (addGtest)

我的配置有CMake 3.6、Visual Studio 2015和GitHub的最新Google测试。我通过一个cmake函数添加单元测试,然后进行构建。在此之后,我可以从我的
run\u TESTS
target运行测试,或者在VS中使用ctrl+F5并按预期工作

最终目标是使用CMake依赖关系管理在构建时运行单元测试。现在,作为第一步,我已经增强了我的功能,创建了一个
自定义\u目标
(包括整个功能,以防工作部分中出现不可预见的问题),但没有构建它:

function (addGtest)
  # vvvv this part works as explained vvvv #
  set (optBOOLS)
  set (optSINGLES EXE)
  set (optLISTS DLL_LIST)
  cmake_parse_arguments (myARGS
    "${optBOOLS}" "${optSINGLES}" "${optLISTS}" ${ARGN})

  # addExecutable is a function that adds target executables
  set(myARGS_DLL_LIST gtest_main gtest "${myARGS_DLL_LIST}")
  addExecutable (EXE ${myARGS_EXE} DLL_LIST ${myARGS_DLL_LIST} ${myARGS_UNPARSED_ARGUMENTS})
  add_test (NAME ${myARGS_EXE} COMMAND ${myARGS_EXE} WORKING_DIRECTORY
    ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
  ) # so it can be run using ctest
  # ^^^^ this part works as explained ^^^^ #

  add_custom_target (${myARGS_EXE}.tgt DEPENDS ${myARGS_EXE}
    COMMAND ${myARGS_EXE} --gtest_output="xml:${myARGS_EXE}.xml"
    WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
  )
endfunction (addGtest)
我尝试提供
命令
选项的完整路径,删除
--gtest_输出
值周围的双引号,但没有效果。另一方面,当我cd到命令行窗口中的工作目录并调用exe时,它工作正常


第一个问题是如何通过构建这个新目标来修复它以运行测试?之后,我计划
添加自定义目标(${myARGS\u EXE}.run)
添加依赖项(${myARGS\u EXE}.run${myARGS\u EXE}.tgt)
。当exe更改时,这会运行测试吗?还是我应该做点别的?谢谢您的帮助。

无法在评论中添加这么多细节,因此给出了此答案

1。原始问题的答案

由于我需要
add\u custom\u target
命令的
WORKING\u目录
选项中与配置相关的路径,但无法将生成器表达式传递给它,因此我的想法是使用
CMAKE\u CFG\u INTDIR
变量:

add_custom_target (${myARGS_EXE}.tgt
  DEPENDS ${myARGS_EXE}
  COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
  WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin
)
现在,当您构建上述目标时,单元测试在
WORKING\u目录中运行,这不是完全需要的,因为这是libs和exe的安装目录。如果能

2。从构建目录运行单元测试

同时,从Visual Studio中提取DLL路径,并将生成的Gtest
.xml
文件存储在生成目录中。这就是解决方案:

在CMake版本3.10中添加了属性。在项目范围的CMakeLists.txt中,
集(CMAKE\u MSVCIDE\u RUN\u PATH${CMAKE\u INSTALL\u PREFIX}/${CMAKE\u CFG\u INTDIR}/bin)
-由于这个#3,我们可以附加
路径
,指向我们的安装目录。然后用以下命令替换上述
add_custom_target
命令:

add_custom_command (
  TARGET ${myARGS_EXE} POST_BUILD
  COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
)
此解决方案避免了创建其他目标的麻烦。显然,只有在构建了
myARGS\u EXE
时,才会运行单元测试。显然,
myARGS\u EXE
对其他DLL的可传递依赖性也包括在内


如果您有其他优雅的解决方案,请发布。

您是否尝试从
add\u custom\u target
调用中删除所有变量的解引用和生成器表达式,并为此调用硬编码所有参数?这种方法在调试问题时很常见,可能与变量的解引用有关。
add_custom_target
命令的
选项的CMake文档中说它可以使用生成器表达式,但在
工作目录
选项中没有提到。如果我硬编码工作目录路径,那么构建目标将执行gtest。将进行更多的研究/调试,并发布任何有用的信息。谢谢,好的。实际上,CMake文档明确地说,哪个选项可以使用生成器表达式。由于命令
add\u custom\u target
没有关于
WORKING\u DIRECTORY
选项的概念,因此不能使用生成器表达式。有趣的是,
add\u test
的相同选项可能会使用生成器表达式(在文档中有明确描述)。
@Tsyvarev
,我发现可以使用
CMAKE\u CFG\u INTDIR
代替生成器表达式。但答案中有更多细节。感谢您硬编码变量的想法。请随时改进我下面的答案。
add_custom_command (
  TARGET ${myARGS_EXE} POST_BUILD
  COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
)