CMake: невозможно включить внешние заголовочные файлы библиотеки в заголовочные файлы моей библиотеки, которые не включены ни в какие исходные файлы - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался найти ответ на этот вопрос. Есть похожие вопросы, но ни один из них не отвечает на мой.

Я пытаюсь создать библиотеку, которая зависит от пары других внешних библиотек. У меня есть внешние библиотеки в виде git подмодулей, и я сам собираю их в CMake, используя add_subdirectory, за которым следует target_link_library.

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

Например, у меня есть внешняя библиотека glm и вызов target_sources(myLib PRIVATE Application.cpp) в моей библиотеке. Заголовочные файлы в моей библиотеке добавляются в проект с помощью target_include_directories.

Теперь я могу сделать #include <glm/glm.hpp> в приложении. cpp файл без проблем.

У меня также есть Файл Application.hpp, включенный в файл Application. cpp. Поскольку он включен, это позволяет мне также делать #include <glm/glm.hpp> в файле Application.hpp.

Однако теперь у меня также есть файл Core.hpp без соответствующего файла Core. cpp. Поскольку файл Core.hpp не включен ни в какие исходные файлы, выполнение #include <glm/glm.hpp> приводит к ошибке, что файл не может быть найден.

Это мой root CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(Ivory)
set(CMAKE_CXX_STANDARD 20)

add_library(${PROJECT_NAME} SHARED)

# Determine compiler platform (x32 or x64)
math(EXPR PLATFORM_BITS "8*${CMAKE_SIZEOF_VOID_P}")
set(PLATFORM "x${PLATFORM_BITS}")

# Determine target build platform
target_compile_definitions(${PROJECT_NAME}
        PUBLIC
            IVORY_WINDOWS
        PRIVATE
            IVORY_BUILD_DLL
)

# Set output directory
set(OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_SYSTEM_NAME}-${CMAKE_BUILD_TYPE}-${PLATFORM})

# Subdirectories
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(executables)

target_include_directories(${PROJECT_NAME} PUBLIC include)

# External Libraries #
set(BUILD_SHARED_LIBS OFF)

# GLM
add_subdirectory(lib/glm)
target_link_libraries(${PROJECT_NAME} PRIVATE glm)

# GLEW
add_subdirectory(lib/glew)
target_link_libraries(${PROJECT_NAME} PRIVATE libglew_static)

# SFML
add_subdirectory(lib/SFML)
target_link_libraries(${PROJECT_NAME} PRIVATE sfml-window sfml-audio)

# SPDLOG
add_subdirectory(lib/spdlog)
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog)

# MinGW
target_link_libraries(${PROJECT_NAME} PRIVATE -static)

# Output Location
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})

Это sr c CMakeLists.txt:

target_sources(${PROJECT_NAME}
    PRIVATE
        Application.cpp
)

Я использую CLion на Windows 10 с компилятором MinGW 7.3 (64 бит). Что я делаю не так?

1 Ответ

0 голосов
/ 24 апреля 2020

Если заголовок Core.hpp предназначен для включения клиентами и заголовки glm вызываются из этого заголовка, зависимость glm в команде target_link_libraries должна быть PUBLIC, а не PRIVATE.

Для документации CMake см. здесь . Для более подробного объяснения ключевых слов PUBLIC, PRIVATE и INTERFACE с примерами см. здесь .

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