#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. Им нужно сосредоточиться на этом немного больше.