Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101

Компиляция серьезной графики под Mingw

19.01.2013, 13:38. Показов 3668. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возьмем для примера gdi+ (c всем остальным у меня получалось абсолютно тоже. только winapi из windows.h пока могу)
пишу элементарный пример, когда довожу его до компиляции, на стадии линковки компилятор чего-то не видит.

простой код не привожу, так как пока не спрашиваю "как написать на gdi+ что-то работающее" а спрашиваю "как в mingw вообще хоть что-то с gdi+ откомпилировать"?
Миниатюры
Компиляция серьезной графики под Mingw  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2013, 13:38
Ответы с готовыми решениями:

Компиляция кода с SDL2 под Windows в MinGW
У меня виндовс семь, система 64битная. Компилятор брал сравнительно недавно (после перестановки винды) отсюда http://www.msys2.org/...

Компиляция в g++ из MinGW
Добрый день! После скачивания и установки MinGW пытаюсь скомпилировать простую программу из разряда Hello, World! Набирая в...

MinGW-w64 компиляция
Проблема не могу скомпилировать код под x64 пробовал с ключом -m64 выдаёт ошибку "sorry, unimplemented: 64-bit mode not compiled...

13
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 13:46
алгоритм исправления ошибок линковки примерно такой:
смотрим, какой символ не зарезолвился (скажем имя функции)
ищем, в какой либе эта функция.
смотрим, подключена ли эта либа к проекту.
если нет, подключаем, пробуем снова.
если подключена, то ...
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 14:08  [ТС]
Спасибо за быстрый ответ, но поясни подробнее
1_ Либа - в смысле #include или dll на стадии линковки?
2_ Конкретно - скажем у меня явно не находит GpidFree. Что надо проделать?
0
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
19.01.2013, 14:10
SeaMonster, линковка делается с помощью ключа -lимялибы
# include-это препоцессорная директива. Линкеру на нее пофиг.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 14:17
да. если дело дошло до линковки, значит все скомпилилось.
но директивы препроцессора тоже могут влиять на линковку. например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo();
#ifdef MY_MACROS
void foo()
{
 ...
}
#endif
 
void bar()
{
   foo();
}
вот тут в зависимости от того, определена ли дирректива, будет или не будет ошибка линковки. это упрощенный случай. всякие там функции в инклудах могут быть огорожены всякими макросами, которые разворачиваются по разному в зависимости от дирректив. так вот. инклуд есть, объявление тоже есть и либа есть. но если либа собрана с одними диррективами, а исходник, который юзает функцию из этой либы - с другими, то в результате получаем, что файл скомпилился, но он использует функции с сигнатурами, отличными от тех, которые находятся в подключенной к проекту либе.
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 14:32  [ТС]
Ну и какую конкретно библиотеку dll по какому пути лежащую в mingw надо попробовать прилинковать? Или скачать сначала где-то надо?
0
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
19.01.2013, 14:44
SeaMonster, гуглить мама не учила?
Загугли функцию которая не найдена, и узнай в какой либе лежит. и прилинкуй ту либу.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 14:46
для линковки нужна lib. длл во премя выполнения понадобится.
по описанному выше алгоритму ищем что не нравится линкеру. сначала это GdipAlloc.
находим ссылку:
http://msdn.microsoft.com/en-u... s.85).aspx
из которой узнаем, что нам нужно GpStatus WINGDIPAPI GdiplusBase void* (operator new)(size_t in_size).
Ок, там есть ссылка на это: http://msdn.microsoft.com/en-u... s.85).aspx
заходим и и видим:
...
Header Gdiplusbase.h (include Gdiplus.h)

Library Gdiplus.lib

DLL Gdiplus.dll
...
Итого, для успешной линковки к проекту должна быть подключена Gdiplus.lib
После сборки бинаря для его запуска ему должна быть доступна Gdiplus.dll


Gdiplus.lib подключена к проекту?
0
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
19.01.2013, 14:51
используй консоль.
Нафиг IDE.
От IDE польза, только когда работаеш с какой-нить хренью типа Qt(ну шибко они закрутили с moc)
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 21:24  [ТС]
Всем спасибо. С добавкой подключения gdiplus.dll в строку компиляции все стало компилиться.

Теперь вопрос. Как передать в конструктор Gdiplus::Image имя файла. Просто const char* компилятор не принимает, пробую так
Gdiplus::Image* m_pImage=NULL;
m_pImage=new Gdiplus::Image(L"1.jpg");
при вызове второй строки даже не просто "не срабатывает код как надо", а все немедленно виснет

Добавлено через 4 часа 45 минут
Написал вот так, совсем вручную, чтобы все с именем было под контролем
C++
1
2
3
4
5
6
7
8
wchar_t buffer4[100];
printf("\nbuff");wprintf(buffer4);;getch();
buffer4[0]='1'; buffer4[1]='.';buffer4[2]='j';buffer4[3]='p';buffer4[4]='g';buffer4[5]=0;
printf("\n buff");wprintf(buffer4);;getch();
Gdiplus::Image* m_pImage=NULL;
printf("\n Start Gdiplus::Image");getch();
m_pImage=new Gdiplus::Image(buffer4);
printf("\n Gdiplus::Image ne pozis!");getch();
все равно, что в конструктор не посылаю - виснет программа....

Добавлено через 26 минут
Что мне очень не нравится. Решил попробовать от отчаяния - может дело в сложности статической компиляции и при динамической все запашет? Попробовал - две известных dll-ки программа начала требовать, а вот gdiplus.dll не стала (ну и по прежнему зависает...)
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
19.01.2013, 21:50
Весь код покажи. GdiplusStartup не забыл?
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
19.01.2013, 22:33
На всякий случай, вдруг пригодится. Алгоримт поиска нужных *.a файлов описан выш. А вот программу я написал, которая делает то же самое;
Вложения
Тип файла: rar poisk.rar (544.3 Кб, 13 просмотров)
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 02:29  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
Весь код покажи. GdiplusStartup не забыл?
Ты телепат! Именно "забыл", точнее даже не знал, что надо... Поискал про него и всё в первом приближении заработало.
Вот мой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<stdio.h>
#include<math.h>
#include<ctype.h>
 
#include <gdiplus.h>
#include<wchar.h>
 
#include <conio.h>
 
#include<windows.h>
/// Разные типичные инклуды
 
#include<Graphics.h>
//// Привычная мне библиотека поддержки кое-какой графики
 
int main(){
int gdriver=DETECT,gmode=0,errorcode;
initgraph(&gdriver,&gmode,"");
//// Оккрытие кое-какой графики на весь экран
 
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput; 
ULONG_PTR gdiplusToken; 
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}  /// Как умею - инициализирую gdi+
 
 
wchar_t buffer4[100];
 
printf("\nbuff");wprintf(buffer4);;getch();
buffer4[0]='1'; buffer4[1]='.';buffer4[2]='j';buffer4[3]='p';buffer4[4]='g';buffer4[5]=0;
printf("\n buff");wprintf(buffer4);;getch();
//// Вручную создаю строку с именем файла в нужном формате, который принимает компилятор
Gdiplus::Graphics graphics(txDC()); //// Выставляю gdi работу с hdc экрана
printf("\nYstanovili hdc ekrana");getch();
Gdiplus::Image* m_pImage=NULL;
printf("\n Start Gdiplus::Image");getch();
//////////////////m_pImage=
///////return 0;
m_pImage=new Gdiplus::Image(buffer4);
printf("\n Gdiplus::Image ne pozis!");getch();
if(m_pImage==NULL){printf("\n NIFIGA NE ONKRILI!!!!");getch();}else{printf("OTKRILI KOE-KAK fail");getch();}
 
Gdiplus::Rect rc(100,100,200,200); //// Создаем рамку
graphics.DrawImage(                m_pImage,                        // [in] Gdiplus::Image object
                rc                                // [in] Position and dimensions
                );
/////Вывод картинки в рамку!
getch();
}
У меня он работает, если скомпилировать строкой g++ test_jpg.cpp -lgdiplus -static

Еще раз всем спасибо, я с Вашей помощью очень здорово продвинулся, но пока считать освоенным мешает бага. В части случаев (примерно явно меньше половины, но наверно больше 10 процентов) программа не срабатывает, т.е. картинку не показывает. В большинстве случаев показывает, но такая нестабильная работа - не дело

Добавлено через 2 часа 33 минуты
Через *** временно решил проблему, повторяя процедуру 100 раз циклом, тогда безусловно открывается. Но это не дело (совершенно бестолковые тормоза плюс неизвестная ошибка может и в другом месте позже всплыть...)

Добавлено через 46 минут
На интуиции решил попробовать выводить не сразу на экран, а на специально созданный hdc. Немного поглючило, но когда для этой в общем простой манипуляции все параметры правильно написал - заработало как часы!

Видимо дело вот в чем. Я это не совсем понимаю, но в виндовской графики перед выводом на экран чего-либо низкоуровневыми функциями надо его сначала в каком-то смысле "запереть" а потом "открыть". Если же я этого не делал, то половину рисовало как надо, половину не рисовало....
Видимо gdi+ и извратная Graphics.h эмулирующая bgi через winapi в этой части не состыкуются.
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
21.01.2013, 18:39  [ТС]
вопросы именно по компиляции. Смотрел в сети разные примеры кода, в том числе на сайте микрософт. При компиляции накладки
1. Мелочь. Запись RotateFlipType::Rotate180FlipY (константа из серии констант, определяющих способы поворотов и отражений) мой MinGw не принял(именно не компилировал! до линковки не доходило), но по подсказкам удалось понять, что надо написать Gdiplus::Rotate180FlipY и заработало как надо, но чего он первое не принимал?
2. Хуже и очень нужен ответ что делать. В классе image компилятор говорит, что нет элементарных Height ! Т.е. переменных размера изображения... Это очень мешает дальше создавать код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2013, 18:39
Помогаю со студенческими работами здесь

Компиляция в MSYS (MinGW)
Всем приветы! Подскажите, есть папка с примерами, там makefile. Я в MSYS захожу в эту папку и набираю make. Пишет: ld.exe cannot...

Mingw компиляция по частям
Добрый день. При задумке одного из проектов есть необходимость компиляции отдельных компонентов и последующей сборки компонентов в...

Компиляция под linux с mingw
Задача: скомпилировать программу для linux(elf) из под windows, используя mingw. Добавлено через 3 минуты Надо собрать кросс...

Компиляция библиотеки boost с использованием mingw под винду
В общем-то возникла следующая задача: прикрутить boost к С++ для работы с модулем asio (среда Qt c мингвой 4.4 собственно) Почитал...

Компиляция c# в MINGW
Всем дорого времени суток собственно есть пару вопросов. -Можно ли скомпилировать проект написанный на языке c# в MINGW? -Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru