У меня есть каталог main, который имеет следующие подкаталоги:
A, B, C, D, Тест.
В тесте у меня есть файл CMakeLists со следующим содержанием:
cmake_minimum_required(VERSION 2.8)
enable_testing()
set(TEST_EXE_NAME test)
add_executable(${TEST_EXE_NAME} test.cpp)
add_test(NAME "testDatabase" COMMAND ${TEST_EXE_NAME})
target_include_directories(Test PUBLIC ./)
target_include_directories(Test A B C D)
target_link_libraries(Test A B C D)
В тесте у меня есть исполняемый файл, который включает несколько заголовочных файлов из A, B, C и D.
Однако после выполнения make я получаю сообщение о том, что cmake не может найти эти заголовочные файлы из A, B, C и D.
Как я могу заставить это уйти?
Из вашего вопроса трудно понять, что именно идет не так. Вот почему я собираюсь описать, как бы я решил всю проблему.
Необходимо иметь CMakeLists.txt
здесь, чтобы иметь возможность использовать цели CMake для A-D в тесте. Это будет выглядеть так:
cmake_minimum_required(VERSION 2.8)
enable_testing()
add_subdirectory(A)
add_subdirectory(B)
add_subdirectory(C)
add_subdirectory(D)
add_subdirectory(Test)
Обратите внимание, что мы называем enable_testing()
Вот. Это позволит вам позвонить make test
в корневой каталог сборки позже.
Там вы создаете библиотеки для A-D.
Например, для A вы должны написать:
add_library(A STATIC [... source files for A ...]) # or SHARED instead of STATIC
target_include_directories(A PUBLIC ./)
Обратите внимание, что с помощью target_include_directories
, вы говорите CMake включить каталоги для библиотек автоматически позже. Это будет полезно ниже.
Теперь это становится довольно просто:
set(TEST_EXE_NAME test)
add_executable(${TEST_EXE_NAME} test.cpp)
target_include_directories(${TEST_EXE_NAME} PUBLIC ./)
target_link_libraries(${TEST_EXE_NAME} A B C D)
add_test(NAME "testDatabase" COMMAND ${TEST_EXE_NAME})
Обратите внимание, что здесь нет необходимости устанавливать каталоги включения для A-D, поскольку CMake уже знал, что они нужны!
Первый аргумент target_include_directories
является целью CMake, а не каталогом, поэтому вы должны использовать следующий код (при условии, что ${TEST_EXE_NAME}
является целью, которая требует заголовков от A, B, C, D):
target_include_directories(${TEST_EXE_NAME} PUBLIC ./)
target_include_directories(${TEST_EXE_NAME} PUBLIC A B C D)
Попробуйте включить A, B, C и D в строку target_include_directories (). Как было упомянуто, строка target_link_libraries () должна указывать библиотеки, не вовлеченные заголовки.