Как создать приложение 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)?
Ответы
Ответ 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
в шаблон команды, но это работает.