Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
#1

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

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

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

простой код не привожу, так как пока не спрашиваю "как написать на gdi+ что-то работающее" а спрашиваю "как в mingw вообще хоть что-то с gdi+ откомпилировать"?
Миниатюры
Компиляция серьезной графики под Mingw  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 13:46     Компиляция серьезной графики под Mingw #2
алгоритм исправления ошибок линковки примерно такой:
смотрим, какой символ не зарезолвился (скажем имя функции)
ищем, в какой либе эта функция.
смотрим, подключена ли эта либа к проекту.
если нет, подключаем, пробуем снова.
если подключена, то ...
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 14:08  [ТС]     Компиляция серьезной графики под Mingw #3
Спасибо за быстрый ответ, но поясни подробнее
1_ Либа - в смысле #include или dll на стадии линковки?
2_ Конкретно - скажем у меня явно не находит GpidFree. Что надо проделать?
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
19.01.2013, 14:10     Компиляция серьезной графики под Mingw #4
SeaMonster, линковка делается с помощью ключа -lимялибы
# include-это препоцессорная директива. Линкеру на нее пофиг.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 14:17     Компиляция серьезной графики под Mingw #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();
}
вот тут в зависимости от того, определена ли дирректива, будет или не будет ошибка линковки. это упрощенный случай. всякие там функции в инклудах могут быть огорожены всякими макросами, которые разворачиваются по разному в зависимости от дирректив. так вот. инклуд есть, объявление тоже есть и либа есть. но если либа собрана с одними диррективами, а исходник, который юзает функцию из этой либы - с другими, то в результате получаем, что файл скомпилился, но он использует функции с сигнатурами, отличными от тех, которые находятся в подключенной к проекту либе.
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 14:32  [ТС]     Компиляция серьезной графики под Mingw #6
Ну и какую конкретно библиотеку dll по какому пути лежащую в mingw надо попробовать прилинковать? Или скачать сначала где-то надо?
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
19.01.2013, 14:44     Компиляция серьезной графики под Mingw #7
SeaMonster, гуглить мама не учила?
Загугли функцию которая не найдена, и узнай в какой либе лежит. и прилинкуй ту либу.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 14:46     Компиляция серьезной графики под Mingw #8
для линковки нужна lib. длл во премя выполнения понадобится.
по описанному выше алгоритму ищем что не нравится линкеру. сначала это GdipAlloc.
находим ссылку:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
из которой узнаем, что нам нужно GpStatus WINGDIPAPI GdiplusBase void* (operator new)(size_t in_size).
Ок, там есть ссылка на это: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
заходим и и видим:
...
Header Gdiplusbase.h (include Gdiplus.h)

Library Gdiplus.lib

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


Gdiplus.lib подключена к проекту?
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
19.01.2013, 14:51     Компиляция серьезной графики под Mingw #9
используй консоль.
Нафиг IDE.
От IDE польза, только когда работаеш с какой-нить хренью типа Qt(ну шибко они закрутили с moc)
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 21:24  [ТС]     Компиляция серьезной графики под Mingw #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 не стала (ну и по прежнему зависает...)
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
19.01.2013, 21:50     Компиляция серьезной графики под Mingw #11
Весь код покажи. GdiplusStartup не забыл?
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
19.01.2013, 22:33     Компиляция серьезной графики под Mingw #12
На всякий случай, вдруг пригодится. Алгоримт поиска нужных *.a файлов описан выш. А вот программу я написал, которая делает то же самое;
Вложения
Тип файла: rar poisk.rar (544.3 Кб, 5 просмотров)
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 02:29  [ТС]     Компиляция серьезной графики под Mingw #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 в этой части не состыкуются.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2013, 18:39     Компиляция серьезной графики под Mingw
Еще ссылки по теме:
Компиляция простейшего кода на C++ под GNU/Linux C++
C++ Компиляция в командной строке (cl.exe) под платформы Windows XP и выше
Можно ли из под linux писать приложения для Windows c использыванием графики!!?? C++
C++ Mingw studio
MinGW + SublimeText 3 C++ C++

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

Или воспользуйтесь поиском по форуму:
SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
21.01.2013, 18:39  [ТС]     Компиляция серьезной графики под Mingw #14
вопросы именно по компиляции. Смотрел в сети разные примеры кода, в том числе на сайте микрософт. При компиляции накладки
1. Мелочь. Запись RotateFlipType::Rotate180FlipY (константа из серии констант, определяющих способы поворотов и отражений) мой MinGw не принял(именно не компилировал! до линковки не доходило), но по подсказкам удалось понять, что надо написать Gdiplus::Rotate180FlipY и заработало как надо, но чего он первое не принимал?
2. Хуже и очень нужен ответ что делать. В классе image компилятор говорит, что нет элементарных Height ! Т.е. переменных размера изображения... Это очень мешает дальше создавать код.
Yandex
Объявления
21.01.2013, 18:39     Компиляция серьезной графики под Mingw
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru