Нет правила для создания цели для googletest

#c #cmake #googletest

#c #cmake #googletest

Вопрос:

Очищаю ржавчину с моего C после многих, многих лет. Много новых вещей, в том числе CmakeLists.txt . Я использую CLION и googletest, с которыми я тоже новичок.

Я следовал инструкции https://raymii.org/s/tutorials/Cpp_project_setup_with_cmake_and_unit_tests.html чтобы настроить модульное тестирование для базового проекта. Теперь я пытаюсь адаптировать этот проект к своему тестовому проекту.

Я изменил структуру библиотеки. Каталог src по-прежнему содержит мой исходный код и tst моего теста, но я создал там каталог lib и подмодуль git для googletest.

Вот мой корень 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
 

Комментарии:

1. Путь к отсутствующей цели ( src/CMakeFiles/processcontroller_test_lib.dir/build ) странный. Похоже, что этот путь (или его относительный вариант) используется в вашем CMakeLists.txt . Я подозреваю, что LIST_DIRECTORIES true это ответственно за это. Попробуйте напечатать (с помощью message() команды) SOURCES переменную в вашем подразделении CMakeLists.txt и убедитесь, что она содержит только ожидаемые файлы.

2. @Tsyvarev обновил вопрос с результатами. Спасибо за вашу помощь.

Ответ №1:

Я не понимаю этих вещей, но все, что я пробовал, не удалось. Наконец, я просто сбросил проект, запустил новый, воссоздал все шаг за шагом с теми же файлами make, и теперь все работает. Что-то застряло в CLion.

Вы можете сказать, что Clion не является флагманским продуктом JetBrains. Им нужно сосредоточиться на этом немного больше.