【发布时间】:2021-05-28 19:30:23
【问题描述】:
多年以后,我的 C++ 上的锈迹被刮掉了。很多新东西,包括 CmakeLists.txt。我正在使用 CLION 和 googletest,这两个我也是新手。
我按照教程https://raymii.org/s/tutorials/Cpp_project_setup_with_cmake_and_unit_tests.html 为一个基本项目设置单元测试。现在我正在尝试使该项目适应我的测试项目。
我更改了库结构。 src 目录仍然包含我的源代码和 tst 我的测试,但我在那里创建了一个 lib 目录和一个用于 googletest 的 git 子模块。
这是我的根 CmakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(processcontroller_test)
set(CMAKE_CXX_STANDARD 17)
include_directories(src)
add_subdirectory(src)
add_subdirectory(tst)
add_subdirectory(lib/googletest)
这里是 src
set(BINARY ${CMAKE_PROJECT_NAME})
file(GLOB_RECURSE SOURCES LIST_DIRECTORIES true *.h *.cpp)
set(SOURCES ${SOURCES})
add_executable(${BINARY}_run ${SOURCES})
add_library(${BINARY}_lib STATIC ${SOURCES})
还有一个用于 tst 的
set(BINARY ${CMAKE_PROJECT_NAME}_tst)
file(GLOB_RECURSE TEST_SOURCES LIST_DIRECTORIES false *.h *.cpp)
set(SOURCES ${TEST_SOURCES})
add_executable(${BINARY} ${TEST_SOURCES})
add_test(NAME ${BINARY} COMMAND ${BINARY})
target_link_libraries(${BINARY} PUBLIC ${CMAKE_PROJECT_NAME}_lib gtest)
现在,当我使用 tst/main.cpp 运行测试时,我得到:
====================[ Build | processcontroller_test_tst | Debug ]==============
/opt/clion/bin/cmake/linux/bin/cmake --build /home/thomas/CLionProjects/processcontroller-test/cmake-build-debug --target processcontroller_test_tst -- -j 12
gmake[3]: *** No rule to make target 'src/CMakeFiles/processcontroller_test_lib.dir/build'. Stop.
gmake[2]: *** [CMakeFiles/Makefile2:227: src/CMakeFiles/processcontroller_test_lib.dir/all] Error 2
gmake[2]: *** Waiting for unfinished jobs....
[ 40%] Built target gtest
gmake[1]: *** [CMakeFiles/Makefile2:262: tst/CMakeFiles/processcontroller_test_tst.dir/rule] Error 2
gmake: *** [Makefile:210: processcontroller_test_tst] Error 2
我认为问题出在我的 tst/CMakeLists.txt 文件的最后一行
target_link_libraries(${BINARY} PUBLIC ${CMAKE_PROJECT_NAME}_lib gtest)
但我不知道怎么做。尝试从文档中阅读有关此内容的信息,但似乎无法理解。
我将 message(STATUS "Source list:" ${SOURCES}) 添加到 src make 文件并将 message(STATUS "Test source list:" ${SOURCES}) 添加到 tst make 并得到了这些结果。
-- Source list:/home/thomas/CLionProjects/processcontroller-test/src/water-dispenser.h
-- Test source list:/home/thomas/CLionProjects/processcontroller-test/tst/Arduino-mock.h/home/thomas/CLionProjects/processcontroller-test/tst/main.cpp/home/thomas/CLionProjects/processcontroller-test/tst/water-dispenser-test.cpp
【问题讨论】:
-
不存在的目标 (
src/CMakeFiles/processcontroller_test_lib.dir/build) 的路径很奇怪。您的CMakeLists.txt中似乎使用了此路径(或其相对变体)。我怀疑LIST_DIRECTORIES true对此负责。尝试在子CMakeLists.txt中打印(通过message()命令)SOURCES变量,并检查它是否只包含预期的文件。 -
@Tsyvarev 用结果更新了问题。感谢您的帮助。
标签: c++ cmake googletest