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的一些澄清
我最终采用了三步解决方案:
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()