2016-10-04 6 views
1

Я работаю в рамках проекта ката, чтобы узнать, как писать модульные тесты в C++ (link to the repository). Одним из элементов этого проекта является библиотека DictionaryPath. Он помещен в отдельном каталоге с посвященной CMakeFile.txt:CMake: Как настроить модульное тестирование библиотеки

cmake_minimum_required(VERSION 3.6 FATAL_ERROR) 

add_library(DictionaryPath 
     include/DictionaryPath/Dictionary.h 
     src/Dictionary.cpp 
     include/DictionaryPath/DictionaryPath.h 
     src/DictionaryPath.cpp 
     src/WordsGraph.cpp 
     src/WordsGraph.h 
     src/DijkstraAlgorithmImpl.cpp 
     src/DijkstraAlgorithmImpl.h 
     src/Path.cpp 
     src/Path.h 
     src/Graph.h 
     src/ShortestPathAlgorithm.h 
     src/DijkstraAlgorithm.h) 

target_include_directories(DictionaryPath PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 
    $<INSTALL_INTERFACE:include> 
    PRIVATE src) 

Он работает поиск с другими целями (клиенты библиотеки), но когда я попытался добавить модульные тесты в том же подкаталоге я столкнулся с проблемой, как определить цель для модульного теста. E.q. WordsGraph класс. Я определил цель:

add_executable(WordsGraphTest test/WordsGraphTest.cpp) 
target_link_libraries(WordsGraphTest GTest::main DictionaryPath) 
add_test(NAME WordsGraphTest COMMAND WordsGraphTest) 

Но если я хотел бы попробовать обратиться к WordsGraph заголовочный файл у меня есть:

test/WordsGraphTest.cpp:9:10: fatal error: 'WordsGraph.h' file not found 

Я понимаю причину - файлы в src/ являются частными, но как в этом случае внутренние библиотеки тестовой библиотеки без реализации для каждой цели, которая ссылается на нее? Должен ли я дублировать сборку необходимых файлов библиотеки в каждом модульном тесте?

ответ

1
add_library(DictionaryPath 
     ... 
     src/WordsGraph.h 
     ... 
) 

target_include_directories(DictionaryPath PUBLIC 
    ... 
    PRIVATE src) 

WordsGraph.h в src, и вы объявили src в качестве частного включают каталог для DictionaryPath.

Если вы не хотите, чтобы сделать больше, чем вызов target_link_libraries при создании модульного теста, вы должны либо перейти в WordsGraph.hinclude или объявить src как публичный или интерфейс включает каталог.

Если вы не хотите, чтобы переместить WordsGraph.h в include, ни объявить src как общественности или интерфейса включают каталог, вы должны добавить вызов target_include_directories:

add_executable(WordsGraphTest test/WordsGraphTest.cpp) 
target_link_libraries(WordsGraphTest GTest::main DictionaryPath) 

target_include_directories(WordsGraphTest PRIVATE src) 

add_test(NAME WordsGraphTest COMMAND WordsGraphTest) 
2

Должно быть легко решить проблему, с которой вы столкнулись (WordsGraph.h не найден). Вы можете использовать include_directories или target_include_directories.

 Смежные вопросы

  • Нет связанных вопросов^_^