【问题标题】:CMake - Imported Library has library dependency that must come firstCMake - 导入的库具有必须首先出现的库依赖项
【发布时间】:2018-06-08 00:22:45
【问题描述】:

我又是一个傻瓜,他试图通过“以正确的方式”做事来做一个像样的FindSDL2.cmake。但是,当涉及到以下问题时,我正在撞墙:

# SDL2main imported target.
add_library(SDL2::SDL2main UNKNOWN IMPORTED)
set_target_properties(SDL2::SDL2main PROPERTIES
                      IMPORTED_LOCATION "${SDL2_MAIN_LIBRARY}")

问题是,当使用 MinGW 编译时,SDL2main 需要-lmingw32 才能找到WinMain。而且它必须在链接器标志中位于 SDL2main 之前。

看来幸福之路要我这样做:

if(MINGW)
    set_target_properties(SDL2::SDL2main PROPERTIES
                          INTERFACE_LINK_LIBRARIES mingw32)
endif()

但这不起作用,因为mingw32 在链接器命令上 SDL2main 之后。它需要在之前。我也不想让目标自己插入它。

【问题讨论】:

    标签: cmake mingw sdl-2


    【解决方案1】:

    好的,这花了我一点时间才弄清楚 - 感谢 #cmake IRC 上的 ngladitz 提供了一些澄清。

    我最终得到了一个三步解决方法:

    1. 将 SDL2main 库设置为一个新的、单独的目标,在我的例子中称为 SDL2::_SDL2main_detail
    2. 将此单独的目标直接链接到SDL2::SDL2。这很重要,否则 CMake 会混淆 SDL2 和 SDL2main 的链接顺序。
    3. 创建仅指向mingw32 并链接到SDL2::_SDL2main_detailSDL2::SD2main 目标。

    这是我的代码:

    # SDL2main imported target.
    if(MINGW)
        # Gross hack to get mingw32 first in the linker order.
        add_library(SDL2::_SDL2main_detail UNKNOWN IMPORTED)
        set_target_properties(SDL2::_SDL2main_detail PROPERTIES
                              IMPORTED_LOCATION "${SDL2_MAIN_LIBRARY}")
    
        # Ensure that SDL2main comes before SDL2 in the linker order.  CMake
        # isn't smart enough to keep proper ordering for indirect dependencies
        # so we have to spell it out here.
        target_link_libraries(SDL2::_SDL2main_detail INTERFACE SDL2::SDL2)
    
        add_library(SDL2::SDL2main INTERFACE IMPORTED)
        set_target_properties(SDL2::SDL2main PROPERTIES
                              IMPORTED_LIBNAME mingw32)
        target_link_libraries(SDL2::SDL2main INTERFACE SDL2::_SDL2main_detail)
    else()
        add_library(SDL2::SDL2main UNKNOWN IMPORTED)
        set_target_properties(SDL2::SDL2main PROPERTIES
                              IMPORTED_LOCATION "${SDL2_MAIN_LIBRARY}")
    endif()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多