ApplicationCreationManual
Содержание
Написание приложения под wine с использованием mingw.
Постановка задачи
Собрать проект Visual Studio С++ под Wine с использованием компилятора mingw.
Инструменты
Для сборки проекта в системе должны быть установлены следующие пакеты:
- wine
- mingw32-gcc-c++
- mingw32-binutils
Дополнительно можно воспользоваться пакетом hd2u для преобразования DOS символов перевода строк.
Названия пакетов даны для дистрибутива ALT Linux. В других дистрибутивах эти названия могут отличаться.
Реализация
Для начала скачиваем проект на Visual Studio:
http://www.codeproject.com/KB/directx/basicdd.aspx
Этот же проект можно взять из каталога vs-source репозитория:
http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git
Из этого проекта нам понадобятся следующие файлы:
BasicDD.cpp cSurface.cpp cSurface.h resource.h resource.rc bmp_bigcar_green.bmp
Из файлов BasicDD.cpp и cSurface.cpp удалим строчку:
#include "stdafx.h"
Создадим Makefile.mingw такого содержания:
MINGW=i586-pc-mingw32 MINGWLIB=/usr/$(MINGW)/sys-root/mingw/lib CC=$(MINGW)-gcc LD=$(MINGW)-ld CXX=$(MINGW)-g++ STRIP=$(MINGW)-strip WINDRES=$(MINGW)-windres -v RANLIB=$(MINGW)-ranlib AR=$(MINGW)-ar # TODO: uncomment me for release RELFLAGS=-D_FORTIFY_SOURCE=2 -O2 #RELFLAGS= CFLAGS=-Wall -Wno-pointer-sign $(RELFLAGS) CXXFLAGS=-Wall $(RELFLAGS) LDADD=-static-libgcc .SUFFIXES: .rc .res .res.o %.o: %.c $(CC) $(CFLAGS) $(ONLYCFLAGS) -c $< -o $@ %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ .rc.res.o: $(WINDRES) $^ $@
Это универсальный makefile для проектов на C и C++, собираемых компилятором mingw.
Кроме этого, сделаем Makefile с конкретными целями сборки:
include Makefile.mingw CXXFLAGS+=-Wall -I/usr/include/wine/windows LDADD+=-lgdi32 -luser32 -lddraw /usr/lib/wine/libuuid.a OBJECTS=BasicDD.o cSurface.o RES=resource.rc all: test.exe test.exe: $(OBJECTS) $(RES).res.o $(CXX) $^ -o $@ $(LDADD) $(RES).res.o: $(RES) $(WINDRES) $^ $@ clean: rm -f $(OBJECTS) $(RES).res.o test.exe
Если все это у вас соберется после команды
make
считайте что вам повезло.
При сборке с версией 1.3.6 оригинального Wine при линковке возникала следующая ошибка:
i586-pc-mingw32-g++ BasicDD.o cSurface.o resource.rc.res.o -o test.exe -static-libgcc -lgdi32 -luser32 -lddraw BasicDD.o:BasicDD.cpp:(.text+0xa7): undefined reference to `_IID_IDirectDraw7' collect2: ld returned 1 exit status make: *** [test.exe] Ошибка 1
Проблема связана с тем, что в libuuid.a отсутствует идентификатор (UIID) интерфейса IDirectDraw7.
Для решения этой проблемы необходимо собрать свою библиотеку libuuid.a, включающую необходимый UIID.
1. Клонируем репозиторий оригинального wine
$ git clone http://source.winehq.org/git/wine.git
2. В файл dlls/uuid/uuid.c добавляем заголовочный файл с нужным UUID:
#include "ddraw.h"
3. Собираем libuuid
После сборки получим 2 файла:
libuuid.cross.a libuuid.a
Нам нужен libuuid.cross.a, т.к. он имеет формат статической библиотеки Windows и собирается с помощью mingw.
Копируем этот файл в каталог примера.
Исправляем строчку с LDADD в Makefile:
LDADD+=-lgdi32 -luser32 -lddraw libuuid.cross.a
После этого сборка должна работать.
Замечания
- В новых версиях Wine каталог dlls/uuid может переехать в другое место
- На самом деле картинка bmp_bigcar_green.bmp для сборки не нужна.
Все собирается и работает без нее, т.к. картинка уже содержится в resource.rc. Но если возникнет необходимость изменить выводимое изображение, необходимо отредактировать этот bmp файл и добавить его в resource.rc.
Ссылки
- Руководство по использованию git
- Репозиторий готового проекта
- Сайт разработчиков оригинального Wine
- Хороший сайт с примерами кода на разных языках