CMake target_include_directories не находит #include закрытого заголовка - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь создать библиотеку со следующей структурой каталогов:

lib1
|-include
| |-lib1
|   |-public.h
|-src
| |-private.h
| |-private.cpp
| |-public.cpp
|-lib
| |-liblib1.a
|-CMakeLists.txt

если заголовок publi c включает частный заголовок для использования его функций.

My CMakeLists.txt выглядит следующим образом:

project(math)

set(SRC_FILES src/private.cpp src/public.cpp)

add_library(${PROJECT_NAME} STATIC ${SRC_FILES})

target_include_directories(
    ${PROJECT_NAME}
    PUBLIC
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
    PRIVATE
        "${CMAKE_CURRENT_SOURCE_DIR}/src"
)

set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES 
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib"
)

Но когда я пытаюсь собрать библиотеку, я получаю сообщение об ошибке public.h о том, что файла нет private.h

При поиске в Google я либо найдите довольно старые сообщения, которые не используют target_include_directories или поддерживают нечистую структуру, помещая все файлы в один каталог

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Если вы включаете заголовок, вы должны указать, где находится этот заголовок. Если вы говорите, что заголовок является частным, вы не сообщаете, где находится заголовок для зависимостей. Когда зависимости включают частный заголовок через publi c, они не знают, где он находится.

Решение: сделайте все заголовки, включенные в заголовок publi c, как publi c. Или, говоря иначе: не включайте частные заголовки в publi c.

1 голос
/ 06 мая 2020

если заголовок publi c включает закрытый заголовок для использования его функций.

Вы не можете этого сделать. Подумайте об этом так: если бы вы выполнили только двоичную версию своей библиотеки, все, что вы отправили бы, это заголовки publi c и результирующие файлы .a / .so вашей библиотеки, но не частные заголовки. и. cpp файлы.

Пользователь вашей библиотеки, который попытается включить заголовок public.h, тогда получит ошибку компиляции, потому что закрытый заголовок, включенный public.h, не может быть найден, поскольку он не был ' t часть выпуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...