ApplicationCreationManual — различия между версиями
(Import from wiki.etersoft.ru) |
|||
(не показаны 4 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | |||
{{MovedFromWikiEterSoftRu|WINE/ApplicationCreationManual}} | {{MovedFromWikiEterSoftRu|WINE/ApplicationCreationManual}} | ||
− | |||
== Написание приложения под wine с использованием mingw. == | == Написание приложения под wine с использованием mingw. == | ||
− | |||
− | |||
=== Постановка задачи === | === Постановка задачи === | ||
Собрать проект Visual Studio С++ под Wine с использованием компилятора mingw. | Собрать проект Visual Studio С++ под Wine с использованием компилятора mingw. | ||
− | |||
− | |||
=== Инструменты === | === Инструменты === | ||
Строка 17: | Строка 11: | ||
Для сборки проекта в системе должны быть установлены следующие пакеты: | Для сборки проекта в системе должны быть установлены следующие пакеты: | ||
− | + | #wine | |
− | + | #mingw32-gcc-c++ | |
− | + | #mingw32-binutils | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
Дополнительно можно воспользоваться пакетом hd2u для преобразования DOS символов перевода строк. | Дополнительно можно воспользоваться пакетом hd2u для преобразования DOS символов перевода строк. | ||
− | |||
− | |||
Названия пакетов даны для дистрибутива ALT Linux. В других дистрибутивах эти названия могут отличаться. | Названия пакетов даны для дистрибутива ALT Linux. В других дистрибутивах эти названия могут отличаться. | ||
− | |||
− | |||
=== Реализация === | === Реализация === | ||
− | |||
− | |||
Для начала скачиваем проект на Visual Studio: | Для начала скачиваем проект на Visual Studio: | ||
[http://www.codeproject.com/KB/directx/basicdd.aspx http://www.codeproject.com/KB/directx/basicdd.aspx] | [http://www.codeproject.com/KB/directx/basicdd.aspx http://www.codeproject.com/KB/directx/basicdd.aspx] | ||
− | |||
− | |||
Этот же проект можно взять из каталога vs-source репозитория: | Этот же проект можно взять из каталога vs-source репозитория: | ||
[http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git] | [http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git] | ||
− | |||
− | |||
Из этого проекта нам понадобятся следующие файлы: | Из этого проекта нам понадобятся следующие файлы: | ||
Строка 62: | Строка 42: | ||
bmp_bigcar_green.bmp</pre> | bmp_bigcar_green.bmp</pre> | ||
− | |||
− | |||
Из файлов [http://wiki.etersoft.ru/BasicDD.cpp BasicDD.cpp] и cSurface.cpp удалим строчку: | Из файлов [http://wiki.etersoft.ru/BasicDD.cpp BasicDD.cpp] и cSurface.cpp удалим строчку: | ||
<pre>#include "stdafx.h"</pre> | <pre>#include "stdafx.h"</pre> | ||
− | |||
− | |||
Создадим [http://wiki.etersoft.ru/Makefile.mingw Makefile.mingw] такого содержания: | Создадим [http://wiki.etersoft.ru/Makefile.mingw Makefile.mingw] такого содержания: | ||
Строка 127: | Строка 103: | ||
.rc.res.o: | .rc.res.o: | ||
− | $(WINDRES) $^ $@</pre> | + | $(WINDRES) $^ $@ |
− | + | </pre> | |
− | + | ||
Это универсальный makefile для проектов на C и C++, собираемых компилятором mingw. | Это универсальный makefile для проектов на C и C++, собираемых компилятором mingw. | ||
− | |||
− | |||
Кроме этого, сделаем Makefile с конкретными целями сборки: | Кроме этого, сделаем Makefile с конкретными целями сборки: | ||
Строка 178: | Строка 151: | ||
<pre>make</pre> | <pre>make</pre> | ||
− | |||
− | |||
считайте что вам повезло. | считайте что вам повезло. | ||
− | |||
Строка 194: | Строка 164: | ||
make: *** [test.exe] Ошибка 1</pre> | make: *** [test.exe] Ошибка 1</pre> | ||
− | |||
− | |||
Проблема связана с тем, что в libuuid.a отсутствует идентификатор (UIID) интерфейса IDirectDraw7. | Проблема связана с тем, что в libuuid.a отсутствует идентификатор (UIID) интерфейса IDirectDraw7. | ||
− | |||
− | |||
Для решения этой проблемы необходимо собрать свою библиотеку libuuid.a, включающую необходимый UIID. | Для решения этой проблемы необходимо собрать свою библиотеку libuuid.a, включающую необходимый UIID. | ||
− | |||
Строка 208: | Строка 173: | ||
<pre>$ git clone http://source.winehq.org/git/wine.git</pre> | <pre>$ git clone http://source.winehq.org/git/wine.git</pre> | ||
− | |||
− | |||
2. В файл dlls/uuid/uuid.c добавляем заголовочный файл с нужным UUID: | 2. В файл dlls/uuid/uuid.c добавляем заголовочный файл с нужным UUID: | ||
<pre>#include "ddraw.h"</pre> | <pre>#include "ddraw.h"</pre> | ||
− | |||
− | |||
3. Собираем libuuid | 3. Собираем libuuid | ||
Строка 224: | Строка 185: | ||
libuuid.a</pre> | libuuid.a</pre> | ||
− | |||
− | |||
Нам нужен libuuid.cross.a, т.к. он имеет формат статической библиотеки Windows и собирается с помощью mingw. | Нам нужен libuuid.cross.a, т.к. он имеет формат статической библиотеки Windows и собирается с помощью mingw. | ||
Копируем этот файл в каталог примера. | Копируем этот файл в каталог примера. | ||
− | |||
− | |||
Исправляем строчку с LDADD в Makefile: | Исправляем строчку с LDADD в Makefile: | ||
<pre>LDADD+=-lgdi32 -luser32 -lddraw libuuid.cross.a</pre> | <pre>LDADD+=-lgdi32 -luser32 -lddraw libuuid.cross.a</pre> | ||
− | |||
− | |||
После этого сборка должна работать. | После этого сборка должна работать. | ||
− | |||
− | |||
=== Замечания === | === Замечания === | ||
− | + | # В новых версиях Wine каталог dlls/uuid может переехать в другое место | |
− | + | # На самом деле картинка bmp_bigcar_green.bmp для сборки не нужна. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
Все собирается и работает без нее, т.к. картинка уже содержится в resource.rc. Но если возникнет необходимость изменить выводимое изображение, необходимо отредактировать этот bmp файл и добавить его в resource.rc. | Все собирается и работает без нее, т.к. картинка уже содержится в resource.rc. Но если возникнет необходимость изменить выводимое изображение, необходимо отредактировать этот bmp файл и добавить его в resource.rc. | ||
− | |||
− | |||
=== Ссылки === | === Ссылки === | ||
− | + | *[http://freesource.info/wiki/RuslanHihin/gitusermanual Руководство по использованию git] | |
− | [http://freesource.info/wiki/RuslanHihin/gitusermanual | + | *[http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git Репозиторий готового проекта] |
− | + | *[http://www.winehq.org Сайт разработчиков оригинального Wine] | |
− | [http://git.etersoft.ru/people/shpigor/packages/ddraw-test.git | + | *[http://www.codeproject.com Хороший сайт с примерами кода на разных языках] |
− | + | {{Wine}} | |
− | [http://www.winehq.org | + | [[Category:Разработка]] |
− | + | ||
− | [http://www.codeproject.com | + |
Текущая версия на 23:32, 8 декабря 2015
Содержание
[убрать]Написание приложения под 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
- Хороший сайт с примерами кода на разных языках