15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
1

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

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

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

простой код не привожу, так как пока не спрашиваю "как написать на gdi+ что-то работающее" а спрашиваю "как в mingw вообще хоть что-то с gdi+ откомпилировать"?
Миниатюры
Компиляция серьезной графики под Mingw  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2013, 13:38
Ответы с готовыми решениями:

Компиляция кода с SDL2 под Windows в MinGW
У меня виндовс семь, система 64битная. Компилятор брал сравнительно недавно (после перестановки...

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

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

Компиляция в MSYS (MinGW)
Всем приветы! Подскажите, есть папка с примерами, там makefile. Я в MSYS захожу в эту папку и...

13
DU
1499 / 1145 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 13:46 2
алгоритм исправления ошибок линковки примерно такой:
смотрим, какой символ не зарезолвился (скажем имя функции)
ищем, в какой либе эта функция.
смотрим, подключена ли эта либа к проекту.
если нет, подключаем, пробуем снова.
если подключена, то ...
0
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 14:08  [ТС] 3
Спасибо за быстрый ответ, но поясни подробнее
1_ Либа - в смысле #include или dll на стадии линковки?
2_ Конкретно - скажем у меня явно не находит GpidFree. Что надо проделать?
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
19.01.2013, 14:10 4
SeaMonster, линковка делается с помощью ключа -lимялибы
# include-это препоцессорная директива. Линкеру на нее пофиг.
0
DU
1499 / 1145 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 14:17 5
да. если дело дошло до линковки, значит все скомпилилось.
но директивы препроцессора тоже могут влиять на линковку. например:
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
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 14:32  [ТС] 6
Ну и какую конкретно библиотеку dll по какому пути лежащую в mingw надо попробовать прилинковать? Или скачать сначала где-то надо?
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
19.01.2013, 14:44 7
SeaMonster, гуглить мама не учила?
Загугли функцию которая не найдена, и узнай в какой либе лежит. и прилинкуй ту либу.
0
DU
1499 / 1145 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 14:46 8
для линковки нужна 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
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
19.01.2013, 14:51 9
используй консоль.
Нафиг IDE.
От IDE польза, только когда работаеш с какой-нить хренью типа Qt(ну шибко они закрутили с moc)
0
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 21:24  [ТС] 10
Всем спасибо. С добавкой подключения 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
2832 / 1641 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
19.01.2013, 21:50 11
Весь код покажи. GdiplusStartup не забыл?
1
быдлокодер
1722 / 909 / 106
Регистрация: 04.06.2008
Сообщений: 5,655
19.01.2013, 22:33 12
На всякий случай, вдруг пригодится. Алгоримт поиска нужных *.a файлов описан выш. А вот программу я написал, которая делает то же самое;
Вложения
Тип файла: rar poisk.rar (544.3 Кб, 13 просмотров)
0
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 02:29  [ТС] 13
Цитата Сообщение от 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
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
21.01.2013, 18:39  [ТС] 14
вопросы именно по компиляции. Смотрел в сети разные примеры кода, в том числе на сайте микрософт. При компиляции накладки
1. Мелочь. Запись RotateFlipType::Rotate180FlipY (константа из серии констант, определяющих способы поворотов и отражений) мой MinGw не принял(именно не компилировал! до линковки не доходило), но по подсказкам удалось понять, что надо написать Gdiplus::Rotate180FlipY и заработало как надо, но чего он первое не принимал?
2. Хуже и очень нужен ответ что делать. В классе image компилятор говорит, что нет элементарных Height ! Т.е. переменных размера изображения... Это очень мешает дальше создавать код.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2013, 18:39
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru