Зависимость статической библиотеки CMake не найдена - PullRequest
0 голосов
/ 01 января 2019

Я собираю статическую библиотеку и связываю ее с моей исполняемой целью.Библиотека прекрасно собирается в вакууме, но когда я пытаюсь включить заголовок из библиотеки, я получаю сообщение об ошибке «Нет такого файла», указывающее на зависимость статической библиотеки.

Насколько я понимаю, моя статическая библиотека должнаконфиденциально включите его зависимости, и потребителю не нужно ничего делать, кроме как связать библиотеку.Это неправильно?Или я просто неправильно включаю зависимости статической библиотеки?

CMakeLists.txt для статической библиотеки:

# Find SDL2 and associated libs
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)

# Build static library dependency SDL2pp
set(SDL2PP_WITH_IMAGE ON)
set(SDL2PP_WITH_MIXER ON)
set(SDL2PP_WITH_TTF ON)
add_subdirectory("${PROJECT_SOURCE_DIR}/../Libraries/libSDL2pp/"
                 "${CMAKE_CURRENT_BINARY_DIR}/Libraries/libSDL2pp/")


# Add our static library target
add_library(Framework_Game STATIC
    Private/GameManager.cpp
    Public/GameManager.h
)

target_include_directories(Framework_Game
    PRIVATE
        ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} 
        ${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
        ${SDL2PP_INCLUDE_DIRS}
        ${CMAKE_CURRENT_SOURCE_DIR}/Private
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/Public
)

target_link_libraries(Framework_Game 
    PRIVATE
        ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES}
        ${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
        ${SDL2PP_LIBRARIES} 
)

CMakeLists.txt для исполняемого файла:

add_executable(NewWorlds Launch.cpp)

target_link_libraries(NewWorlds 
    PRIVATE
        Framework_Game
)

GameManager.h включает SDL2pp с #include <SDL2pp/SDL2pp.hh.Затем я включаю его в Launch.cpp с #include <GameManager.h>, который выдает ошибку SDL2pp/SDL2pp.hh: No such file or directory

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Насколько я понимаю, моя статическая библиотека должна в частном порядке включать ее зависимости, и потребителю не нужно ничего делать, кроме как связать библиотеку.Это неправильно?Или я просто неправильно включаю зависимости статической библиотеки?

Это дизайнерское решение, но да, обычно это хорошая практика.Но это означает, что ни один заголовок SDL не должен быть включен в публичные заголовки библиотеки!Это твоя работа.В противном случае вам нужно распространять зависимость, как сказал Корристо.

0 голосов
/ 01 января 2019

Вы сделали конфиденциальную зависимость SDL2pp для Framework_Game, поэтому она не распространяется на цели в зависимости от Framework_Game.Я не знаю библиотеку SDL2pp, поэтому не могу точно сказать, какая из них должна быть общедоступной, но

target_include_directories(Framework_Game
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/Private
    PUBLIC
        ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} 
        ${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
        ${SDL2PP_INCLUDE_DIRS}
        ${CMAKE_CURRENT_SOURCE_DIR}/Public
)

target_link_libraries(Framework_Game 
    PUBLIC
        ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES}
        ${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
        ${SDL2PP_LIBRARIES} 
)

определенно будет работать.

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