CMake GoogleTests 找不到我的测试文件中导入的头文件
CMake GoogleTests can't find header file imported in my test file
我们(三个学生)对 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
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()
调用中。此调用应仅包括预定义的 targets、library 名称或链接选项作为参数;不要将源文件列表添加到此调用。我也不确定您在 add_executable()
调用中在哪里定义了 ${sources}
参数,但也许您打算将 ${MY_SRC}
放在那里。
最后,EXCLUDE
限定符不适用于 file(GLOB_RECURSE ...)
签名。但是,您可以使用 list(REMOVE_ITEM ...)
:
从列表 之后 中删除一个 specific 文件
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)
我们(三个学生)对 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
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()
调用中。此调用应仅包括预定义的 targets、library 名称或链接选项作为参数;不要将源文件列表添加到此调用。我也不确定您在 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)