CMake - импортированная библиотека имеет библиотечную зависимость, которая должна стоять на первом месте - PullRequest
0 голосов
/ 08 июня 2018

Я еще один дурак, который пытается заработать приличную 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 по команде компоновщика.Это должно быть до .Я также предпочел бы не обременять цели, вставляя их самостоятельно.

1 Ответ

0 голосов
/ 10 июня 2018

Хорошо, мне понадобилось немного разобраться - спасибо ngladitz на #cmake IRC за некоторые разъяснения.

Я закончил с трехшаговым обходным путем:

  1. Настройте библиотеку SDL2main как новую отдельную цель, в моем случае называемую SDL2::_SDL2main_detail.
  2. Свяжите эту отдельную цель напрямую с SDL2::SDL2.Это важно, иначе CMake будет смешивать порядок ссылок SDL2 и SDL2main.
  3. Создайте цель SDL2::SD2main, которая просто указывает на mingw32 и связывает с SDL2::_SDL2main_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()
...