CMake GoogleTests找不到导入到我的测试文件中的头文件

时间:2019-11-12 23:45:48

标签: c++ unit-testing cmake googletest

我们(三个学生)是CMake的新手。对于一个大学项目,我们必须将GoogleTest包含在我们的代码库中,但我们遇到了很多麻烦。

我们有一个gtest_ours.cmake文件:

project("googletests")

enable_testing()
include(GoogleTest)

file(GLOB_RECURSE MY_SRC
        "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
        # header don't need to be included but this might be necessary for some IDEs
        "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h"
        EXCLUDE
        "${CMAKE_CURRENT_SOURCE_DIR}/src/MolSim.cpp"
        )

add_subdirectory(googletest)
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

add_executable(ParticleContainerTest ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/test/ParticleContainerTest.cpp )
target_link_libraries(ParticleContainerTest ${MY_SRC} gtest gtest_main gmock gmock_main)

gtest_discover_tests(ParticleContainerTest)

set_tests_properties(${noArgsTests}   PROPERTIES TIMEOUT 10)
set_tests_properties(${withArgsTests} PROPERTIES TIMEOUT 20)

,从CMakeLists.txt文件中,我们仅调用:

include(gtest_ours)

我们的文件夹结构为:

main
- src
- test
- CMakeLists.txt
- others

请帮助,我们遇到以下错误:

/home/lunaticcoding/psemoldyn_groupc/MolSim-master/test/ParticleContainerTest.cpp:9:10: fatal error: ../src/ParticleContainer.h: No such file or directory
 #include "../src/ParticleContainer.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/ParticleContainerTest.dir/build.make:62: recipe for target 'CMakeFiles/ParticleContainerTest.dir/test/ParticleContainerTest.cpp.o' failed
make[2]: *** [CMakeFiles/ParticleContainerTest.dir/test/ParticleContainerTest.cpp.o] Error 1
CMakeFiles/Makefile2:144: recipe for target 'CMakeFiles/ParticleContainerTest.dir/all' failed
make[1]: *** [CMakeFiles/ParticleContainerTest.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

1 个答案:

答案 0 :(得分:1)

gtest_ours.cmake文件存在几个问题。由于尚未为目标ParticleContainerTest定义包含ParticleContainer.h的包含目录,因此引发了错误。您只添加了gtest_SOURCE_DIR目录作为包含目录。要解决此问题,请考虑在add_executable()之后添加以下行:

target_include_directories(ParticleContainerTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)

通过这种方式,src目录将成为包含目录,因此您可以修改test/ParticleContainerTest.cpp使其具有更合理的#include

#include "ParticleContainer.h"

此外,我不确定您打算在何处使用${MY_SRC}源文件,但是您不想在target_link_libraries()调用中包含此文件。该调用应仅包括预定义的目标名称或链接选项作为参数;不要为此调用添加源文件列表。我也不确定在${sources}调用中您在add_executable()参数中定义的位置,但是也许您打算将${MY_SRC}放在那里。


最后,EXCLUDE限定符不适用于file(GLOB_RECURSE ...)签名。但是,您可以使用list(REMOVE_ITEM ...)从列表之后中删除特定文件:

file(GLOB_RECURSE MY_SRC CONFIGURE_DEPENDS
        "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
        # header don't need to be included but this might be necessary for some IDEs
        "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h"
)
list(REMOVE_ITEM MY_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/MolSim.cpp)