【问题标题】:CMake Static library's dependency can't be found找不到 CMake 静态库的依赖项
【发布时间】:2019-01-01 19:30:51
【问题描述】:

我正在构建一个静态库并将其链接到我的可执行目标中。该库在真空中构建良好,但是当我尝试从库中包含一个标头时,我得到一个指向静态库依赖项的“没有这样的文件”错误。

我的理解是我的静态库应该私下包含它的依赖项,消费者除了链接库之外不需要做任何事情。这是错的吗?还是我只是不正确地包含了静态库的依赖项?

静态库的 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。然后我将它包含在带有#include <GameManager.h> 的Launch.cpp 中,这会给出错误SDL2pp/SDL2pp.hh: No such file or directory

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    您将 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} 
    )
    

    肯定会起作用的。

    【讨论】:

      【解决方案2】:

      我的理解是我的静态库应该私下包含它的依赖项,消费者除了链接库之外不需要做任何事情。这是错的吗?还是我只是不正确地包含了静态库的依赖项?

      这是一个设计决定,但是是的,这通常是好的做法。但这意味着库的公共标头中必须包含任何 SDL 标头!那是你的工作。否则,您需要像 Corristo 所说的那样传播依赖关系。

      【讨论】:

      • 使用任何一种方法,我都克服了最初的问题,但在尝试调用 SDL 函数时遇到了 SDL2pp 得到未定义的引用错误。在为 SDL2pp 提供 SDL 依赖项时我缺少什么吗?这是一个新问题,在我将此代码移出库之前,SDL2pp 运行良好。
      • 通过将 SDL2pp 从传递旧式变量更改为现代基于目标的链接来使其工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多