CMake: не могу найти заголовочные файлы

У меня есть каталог 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.

Как я могу заставить это уйти?

2

Решение

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

В вашем «главном каталоге»

Необходимо иметь 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-D.
Например, для A вы должны написать:

add_library(A STATIC [... source files for A ...]) # or SHARED instead of STATIC
target_include_directories(A PUBLIC ./)

Обратите внимание, что с помощью target_include_directories, вы говорите CMake включить каталоги для библиотек автоматически позже. Это будет полезно ниже.

В папке Test

Теперь это становится довольно просто:

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 уже знал, что они нужны!

1

Другие решения

Первый аргумент 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)
2

Попробуйте включить A, B, C и D в строку target_include_directories (). Как было упомянуто, строка target_link_libraries () должна указывать библиотеки, не вовлеченные заголовки.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector