CMake-导入的库必须首先具有库依赖项

CMake-导入的库必须首先具有库依赖项,cmake,mingw,sdl-2,Cmake,Mingw,Sdl 2,我又是一个傻瓜,试图用“正确的方式”做事,从而创造一个体面的FindSDL2.cmake。然而,当涉及到以下问题时,我的头撞到了墙上: # SDL2main imported target. add_library(SDL2::SDL2main UNKNOWN IMPORTED) set_target_properties(SDL2::SDL2main PROPERTIES IMPORTED_LOCATION "${SDL2_MAIN_LIBRARY}

我又是一个傻瓜,试图用“正确的方式”做事,从而创造一个体面的
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
之后。它需要在之前。我也不想让目标承担插入它的负担。

好吧,我花了一点时间才弄明白-多亏了ngladitz对#cmake IRC的一些澄清

我最终采用了三步解决方案:

  • 将SDL2main库设置为一个新的、单独的目标,在我的例子中称为
    SDL2::_SDL2main_detail
  • 将此单独的目标直接链接到
    SDL2::SDL2
    。这很重要,否则CMake会混淆SDL2和SDL2main的链接顺序
  • 创建只指向
    mingw32
    SDL2::SD2main
    目标,并链接到
    SDL2::\u SDL2main\u detail
  • 这是我的密码:

    # 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()