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

Posted

技术标签:

【中文标题】CMake GoogleTests 在我的测试文件中找不到导入的头文件【英文标题】:CMake GoogleTests can't find header file imported in my test file 【发布时间】:2019-11-12 23:45:48 【问题描述】:

我们(三个学生)对 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

【问题讨论】:

如果您将"." 添加到include_directories,它应该可以工作。 【参考方案1】:

gtest_ours.cmake 文件存在几个问题。出现错误是因为您尚未将 ParticleContainerTest 目标的包含目录定义为包含 ParticleContainer.h。您只添加了 gtest_SOURCE_DIR 目录作为包含目录。要更正此问题,请考虑在add_executable() 之后添加此行:

target_include_directories(ParticleContainerTest PRIVATE $CMAKE_CURRENT_SOURCE_DIR/src)

这样src目录就会是一个include目录,所以你可以修改test/ParticleContainerTest.cpp得到一个更合理的#include

#include "ParticleContainer.h"

另外,我不确定您打算在哪里使用 $MY_SRC 源文件,但您不想将其包含在 target_link_libraries() 调用中。此调用应仅包含预定义的 targetslibrary 名称或链接选项作为参数;不要在此调用中添加源文件列表。我也不确定您在 add_executable() 调用中定义 $sources 参数的位置,但也许您打算将 $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)

【讨论】:

如何在此处的 src 目录中排除包含 main 函数的 file.cpp:file(GLOB_RECURSE MY_SRC "$CMAKE_CURRENT_SOURCE_DIR/src/*.cpp" # header 不需要被包括在内,但这对于某些 IDE 可能是必要的 "$CMAKE_CURRENT_SOURCE_DIR/src/*.h" EXCLUDE "$CMAKE_CURRENT_SOURCE_DIR/src/MolSim.cpp" ) 我现在手动(一个一个)包含文件并且它正在工作(如果你碰巧知道如何回答上面的评论,那就太棒了)但是因为它正在工作 -> 我爱你,伙计:DDDD 非常感谢你 @MarcoPapula 一个接一个地包含文件是首选方法;通常会有意想不到的后果(正如file(GLOB ... ) 本身的 CMake 文档中所警告的那样)。但是,我扩展了我的答案以显示如何使用GLOB 从列表中排除一个文件。很高兴它正在工作!

以上是关于CMake GoogleTests 在我的测试文件中找不到导入的头文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 cmake 项目中包含另一个 cmake 项目的头文件?

如何通过CMake查找特定/本地文件

使用 Cmake,如何防止库源包含在我的 IDE 中?

链接 cxx 可执行文件时出现 Cmake 错误未定义引用

如何预测CMake在给定平台上选择LIBDIR

使用自定义 cmake 版本变量测试包版本集