Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Unit testing cmake:如何分别编译生产代码和测试代码_Unit Testing_Cmake_Googletest - Fatal编程技术网

Unit testing cmake:如何分别编译生产代码和测试代码

Unit testing cmake:如何分别编译生产代码和测试代码,unit-testing,cmake,googletest,Unit Testing,Cmake,Googletest,我读过关于如何将Google测试与CMake集成的文章。该项目的大纲如下所示: +-- CMakeLists.txt +-- main | +-- CMakeLists | +-- main.cpp | +-- test | +-- CMakeLists.txt | +-- testfoo | +-- CMakeLists.txt | +-- main.cpp | +-- testfoo.h | +-- testfoo.cp

我读过关于如何将Google测试与CMake集成的文章。该项目的大纲如下所示:

+-- CMakeLists.txt
+-- main
|    +-- CMakeLists
|    +-- main.cpp
|
+-- test
|    +-- CMakeLists.txt
|    +-- testfoo
|       +-- CMakeLists.txt
|       +-- main.cpp
|       +-- testfoo.h
|       +-- testfoo.cpp
|       +-- mockbar.h
|
+-- libfoo
|    +-- CMakeLists.txt
|    +-- foo.h
|    +-- foo.cpp
|
+-- libbar
     +-- CMakeLists.txt
     +-- bar.h
     +-- bar.cpp
(对于感兴趣的用户,可以从中签出此示例项目的整个代码)

顶级CMakeLists.txt包含(除其他外)语句
enable\u testing()
add\u子目录(test)
。编译和运行测试用例非常适合这种设置,只需运行

mkdir build && cd build
cmake ..
make
make test
但是我如何将这个项目编译成生产代码,即只有组件
test
libfoo
libbar
,而没有所有的单元测试


我是否应该让语句
enable_testing()
add_子目录(test)
以某种方式依赖于某些构建配置变量?或者这方面的最佳实践是什么?

我要做的是为单元测试创建创建一个自定义宏,该宏执行以下操作:

set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)

然后,您的测试将在一个特殊目录(
test
)中结束,而不是在常规目录(通常是
bin
)中结束。然后,对于生产,您只需复制常规目录,而不复制测试目录。

要仅根据请求构建测试,我采用以下方式:

  • 添加一个选项
    选项(上的构建测试“构建单元测试”)
  • 仅在启用BUILD_测试时才包括测试子项
  • if(构建测试)
    添加_子目录(测试)
    endif()

    在您的情况下,您可以将其修改为testfoo

    当您要求进行生产时,您可以使用以下选项来仅在调试模式下生成:

    if(“${CMAKE\u BUILD\u TYPE}”STREQUAL“Debug”)
    添加_子目录(测试)
    
    endif()。我想知道你们是否知道目标属性?所以你们说你们通常总是同时构建生产代码和测试代码?好的,我想得越多,我就越同意它(虽然在这种情况下,构建测试代码有时可能有点繁重,因为它也下载和构建googletest——但有解决方案)。实际上,到不同输出目录的分离已经完成。我不太确定你发布的命令会带来什么好处。