Подтвердить что ты не робот

Как создать приложение Win32 с файлом ресурсов с помощью cmake и MinGW?

В теории очень легко построить приложение Win32 с файлом ресурсов с помощью cmake. В команде add_executable файл ресурсов может быть указан так же легко, как исходный файл C или С++. Однако существует известная ошибка при создании с использованием инструментов MinGW.

Я нашел обходное решение, которое должно включать следующее в CMakeFiles.txt...

if(MINGW)
  set(CMAKE_RC_COMPILER_INIT windres)
  ENABLE_LANGUAGE(RC)
  SET(CMAKE_RC_COMPILE_OBJECT
      "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
endif(MINGW)

К сожалению, это не работает. Похоже, что windres создает файл <whatever>.rc.res, который ld не понимает.

В моих поисках у меня появилось сильное подозрение, что поддержка Win32 рассматривается как очень низкий приоритет, особенно вне Visual Studio. Это понятно, так как Win32, очевидно, не так важен, как когда-то. И, конечно, Visual Studio Express Edition легко доступны бесплатно.

Несмотря на это, мне было бы удобно, если бы я мог использовать MinGW GCC для нескольких старых приложений Win32, которые я по-прежнему использую. Если ничего другого, я могу получить статистику покрытия GCOV.

Очевидно, что если все остальное не удается, я всегда могу обрабатывать файлы ресурсов, используя команду пользовательской сборки. Одна из проблем заключается в том, что я не знаком ни с windres, ни с ld, или с тем, как MinGW предназначен для обработки файлов ресурсов Win32. Другое дело, что я действительно не хочу изобретать велосипед, если у кого-то уже есть превосходное колесо, которое они хотели бы разделить со мной.

Итак, в основном это - как я могу поддерживать создание приложений Win32 с файлами ресурсов с помощью cmake и использование MinGW (но не нарушая поддержку Visual Studio)?

4b9b3361

Ответ 1

Я думаю, ваша проблема здесь:

<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>

Может быть, вы должны написать что-то вроде этого:

<CMAKE_RC_COMPILER> <SOURCE> <OBJECT>

Или более формальный:

<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>

Другая возможная проблема может заключаться в следующем: - какое расширение выполняет cmake? Поскольку windress угадает необходимый формат выходного файла из этого.

Ссылки здесь: www.mingw.org/wiki/MS_resource_compiler

"res" файлы неуместны для ld, как вы уже знаете, и пример windres sourceware.org/binutils/docs/binutils/windres.html

windres man

ИЗМЕНИТЬ автор вопроса...

Исправленный фрагмент кода cmake выглядит следующим образом:

if(MINGW)
  set(CMAKE_RC_COMPILER_INIT windres)
  ENABLE_LANGUAGE(RC)
  SET(CMAKE_RC_COMPILE_OBJECT
    "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
endif(MINGW)

Вероятно, это должно быть установка переменной flags, а не вставка параметра -O в шаблон команды, но это работает.