找不到CMake静态库的依赖项

时间:2019-01-01 19:30:52

标签: c++ cmake

我正在构建一个静态库并将其链接到我的可执行目标中。该库可以在真空中很好地构建,但是当我尝试从库中包含标头时,出现“ No such file”错误,指向静态库的依赖项。

我的理解是,我的静态库应私下包括其依赖关系,并且使用者除了链接库外无需执行任何操作。这是错的吗?还是我只是不正确地包含了静态库的依赖项?

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包含带有#include <SDL2pp/SDL2pp.hh的SDL2pp。然后,我将其包含在{。{1}}中的Launch.cpp中,这将给出错误#include <GameManager.h>

2 个答案:

答案 0 :(得分:2)

您已将Framework_Game的SDL2pp依赖项设为私有,因此它不会传播到取决于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} 
)

肯定会工作。

答案 1 :(得分:1)

  

我的理解是,我的静态库应私下包括其依赖关系,并且使用者除了链接库外无需执行任何操作。这是错的吗?还是我只是不正确地包含了静态库的依赖项?

这是一个设计决策,但是是的,这通常是好的做法。但这意味着库的公共头中不得包含SDL头!那是你的工作。否则,您需要传播依赖性,如Corristo所说。