Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Траблы с MinGW и, как оказалось, -mwindows, длинная повесть, не хотите - не читайте. 
V
    Опции темы
Shaggie
Дата 6.11.2007, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



За выходные (2 дня бился головой о клавиатуру) решение нашлось... вопрос в его адекватности.

Есть примитивный код на ВинАПИ, создающий иконку в трее, разворачивающий маленькое меню по щелчку правой кнопкой мыши и открывающее OpenFile диалог по выбору одного из пунктов. Приводить код не буду, он прост до неприличия, по сути - каркас для будущего приложения.

Решился я (как джавный программист) использовать в качестве IDE незабвенный Eclipse, присобачив у нему MinGW 3.4.2. Задача решаемая, скачал cdt3.1, установил, настроил согласно многочисленным мануалам. Кстати, интересная штука... сначала пытался установить cdt4.0.1, но он по непонятным причинам затребовал установленный плагин org.eclipse.core.filesystem_1.0.0 и без него отказывался ставиться. То, что плагин был уже установлен, его не интересовало... Ну да позже разберусь.

Дальше штука вот такая - компилился файл в объектный без приключений, но при сборке линкер выдавал Undefined Reference to GetOpenFileNameA@4. Хидер (commdlg) был подключен правильно, пути к библиотеке (libcomdlg32.a) тоже были прописаны, значит, где-то чего-то я недоглядел...

Несколько часов тыканья по различным настройкам эклипса привели к тому, что я решил наплевать на Managed C++ Make и скомпилить просто из командной строки, чтобы сориентироваться в ситуации. Однако и там линковка давала тот же результат! Не помогали ни ключ -l"путь к библиотеке", ни ключ -L"путь к библиотекам", ни #pragma comment(lib, "libcomdlg32.a") в коде. Причём g++ -print-file-name=libcomdlg32.a показывал, что библиотека есть и все пути прописаны правильно.

В результате помог ход конём. Какая среда обычно работает с MinGW? Правильно, Dev-Cpp. Сборка из под него выдавала ту же ненавистную ошибку, однако на этот счёт гугл имел своё мнение. Так и сказал - "в настройках проекта пропиши линкеру -lбиблиотека". Не сказать, чтобы соврал... именно в таком виде работать отказался. Но без -l и с указанием полного пути вдруг всё собралось!

И среди многочисленных ключей в недрах make файла, созданного это IDE, сверкнуло -mwindows...

Как итог моих терзаний, в эклипсе правый клик по папке проекта -> Properties -> C/C++ Build -> Tool Settings -> GCC C++ Linker -> Command и вписывание строчки mingw32-g++ -mwindows дало ожидаемый результат. Всё собралось!

Как оказалось, проблема не в эклипсе, а в ловкости обращения с MinGW 3.4.2... А теперь внимание, вопрос. 

Почему???? Почему именно так??? Это же и так компилятор под виндовс, зачем ему ещё эту строчку указывать? Почему он прекрасно разобрался с подключением функций из shellapi, но сломался на OpenDialog'е? Постфактум, поиск по всему С++ подразделу форума на строчку -mwindows не дал ни одного совпадения! Этот ключ ни разу не упоминался... и гугл молчит! Я в дауне.

Вот пример кода, который требует обязательного указания ключа -mwindows.
Код

#include <windows.h>
#include <commdlg.h> // по идее можно не подключать, это происходит внутри windows.h

const int MAXBUFFER = 65500;
char buffer[MAXBUFFER] = {0};
OPENFILENAME ofn = {0};

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFilter = "Images\0*.jpg;*.png\0\0";
    ofn.lpstrFile = buffer;
    ofn.nMaxFile = MAXBUFFER;
    ofn.Flags = OFN_FILEMUSTEXIST | \
                OFN_PATHMUSTEXIST | \
                OFN_LONGNAMES | \
                OFN_EXPLORER | \
                OFN_HIDEREADONLY;

    if (GetOpenFileName(&ofn)) {
        MessageBox(NULL, buffer, "You Have selected", MB_OK);
    }
}

Компилится с командной строки так: g++ -mwindows -o Open.exe Open.cpp
Если опустить ключ -mwindows, ругается на undefined reference to GetOpenFileNameA@4.
Кто может пролить свет на загадку? Или это просто у меня кривая версия MinGW?


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
EnergoHokum
Дата 6.11.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



В MSDN-е при GetOpenFileName нету [Base], а, например, при CreateNamedPipe - [Base] есть. Может, в этом заморочка?
А вот что нашёл Рамблер (Гуголь в полном пролёте, я в шоке!!!): тыц
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
В данном примере мы создаем hello.exe из hello.o, флаг -mwindows необходим, чтобы создать Windows-приложение, а не консольное. Этим мы говорим компилятору, что нужно подключить соответствующие библиотеки. Чтобы получить консольный экран наряду со стандартным приложением Windows, добавьте -mconsole флаг так же как -mwindows.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
А так же (опять Рамблер): тыц_2


Это сообщение отредактировал(а) EnergoHokum - 6.11.2007, 09:52
PM MAIL ICQ   Вверх
archimed7592
Дата 6.11.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(EnergoHokum @  6.11.2007,  09:46 Найти цитируемый пост)
Гуголь в полном пролёте, я в шоке!!!

12.

Просто, видимо, кто-то гуглём пользоваться не умеет...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Shaggie
Дата 6.11.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(archimed7592 @  6.11.2007,  12:15 Найти цитируемый пост)
Просто, видимо, кто-то гуглём пользоваться не умеет... 

Ага, ну правильно, гугл минус перед словом воспринимает как директиву, что это слово находить не надо  smile 

Ок, всем спасибо, проблему подсветили с нужной стороны. Хотя я всё равно не понимаю, почему 1) нельзя просто прилинковать функции из нужных библиотек без лишних ключей, и 2) почему функции для работы с треем (явно виндовские) прекрасно линкуются безо всяких подсказок.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
archimed7592
Дата 6.11.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(Shaggie @  6.11.2007,  12:31 Найти цитируемый пост)
Хотя я всё равно не понимаю

Код

archimed7592@PC ~/testlabs/g++
$ cat ./main.cpp
#include <windows.h>
#include <commdlg.h> // по идее можно не подключать, это происходит внутри windo
ws.h
const int MAXBUFFER = 65500;
char buffer[MAXBUFFER] = {0};
OPENFILENAME ofn = {0};
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFilter = "Images\0*.jpg;*.png\0\0";
    ofn.lpstrFile = buffer;
    ofn.nMaxFile = MAXBUFFER;
    ofn.Flags = OFN_FILEMUSTEXIST | \
                OFN_PATHMUSTEXIST | \
                OFN_LONGNAMES | \
                OFN_EXPLORER | \
                OFN_HIDEREADONLY;
    if (GetOpenFileName(&ofn)) {
        MessageBox(NULL, buffer, "You Have selected", MB_OK);
    }
}

archimed7592@PC ~/testlabs/g++
$ g++ ./main.cpp -lcomdlg32

archimed7592@PC ~/testlabs/g++
$


Добавлено через 2 минуты и 9 секунд
Ах, ну да, ты наверное писал
Код

g++ -lcomdlg32 ./main.cpp

Библиотеки должны указываться после модулей/объектников.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Shaggie
Дата 6.11.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



archimed7592, маг и волшебник! Ещё такой вопрос: Почему требуется писать -lcomdlg32, если в папке либ файл хранится как libcomdlg32? Префикс "lib" проглатывается автоматически? Это из за него все косяки, оказывается, и Эклипс заработал правильно!


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
archimed7592
Дата 6.11.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(Shaggie @  6.11.2007,  12:53 Найти цитируемый пост)
Ещё такой вопрос: Почему требуется писать -lcomdlg32, если в папке либ файл хранится как libcomdlg32?

В папке он хранится вообще как libcomdlg32.a smile.
Ну так устроен gcc - он автоматом добавляет lib спереди и .a/.so(.dll для windows) в конце.

Добавлено через 48 секунд
К слову -mwindows тебе всё равно понадобится, ибо у тебя WinMain, а не main.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
orthrus
Дата 6.11.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: нет
Всего: 16



У меня была такая же проблема, только с FOX-toolkit. При сборке MinGW-шный g++ выдавал кучу ошибок намекая на то что не подключена какая то библиотека. Я потратил пару часов на подбор библиотек методом тыкаsmile В итоге все решилось как раз вот этой опцией, которую я тоже увидел в Makefile тестовых примеровsmile


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
Shaggie
Дата 6.11.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(archimed7592 @  6.11.2007,  12:56 Найти цитируемый пост)
К слову -mwindows тебе всё равно понадобится, ибо у тебя WinMain, а не main. 

Ну, у тебя в примере только что всё собралось без изъянов, а дальше посмотрим. Правда как подумаю, что мне надо будет читать JPEG и PNG средствами WinAPI, сразу вешаться охота, а MFC я презираю (предвзято, надо отметить). Вроде Qt работает с ними на высоком уровне, но это тема для другой беседы.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
archimed7592
Дата 6.11.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Ещё можно обратить внимание на libpng, libjpeg.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zkv
Дата 6.11.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 92



Цитата(Shaggie @  6.11.2007,  13:40 Найти цитируемый пост)
Правда как подумаю, что мне надо будет читать JPEG и PNG средствами WinAPI, сразу вешаться охота, а MFC я презираю (предвзято, надо отметить).

1. в WinAPI нет средств для чтения JPEG и PNG
2. в MFC нет средств для чтения JPEG и PNG

нет наврал нагло, есть, ведь раньше даже работал - сорри.  
  
Цитата(archimed7592 @  6.11.2007,  13:43 Найти цитируемый пост)
Ещё можно обратить внимание на libpng, libjpeg. 

еще достаточно много в сети оберток над ними, cximage например.

Это сообщение отредактировал(а) zkv - 6.11.2007, 15:30
PM MAIL   Вверх
EnergoHokum
Дата 6.11.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Получается что да, не умеет (знак огорчения). И всё таки, почему в МСДН-е при GetOpenFileName нету [Base], и вообще написано, что эта функция из WinMobile-вского SDK?
PM MAIL ICQ   Вверх
archimed7592
Дата 6.11.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(EnergoHokum @  6.11.2007,  15:15 Найти цитируемый пост)
И всё таки, почему в МСДН-е при GetOpenFileName нету [Base],

Потому что это пишется только рядом с ф-циями из kernel32.dll.


Цитата(EnergoHokum @  6.11.2007,  15:15 Найти цитируемый пост)
и вообще написано, что эта функция из WinMobile-вского SDK? 

Наверное потому, что кое-кто не только гуглём пользоваться не умеет, но и MSDN.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Shaggie
Дата 6.11.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(zkv @  6.11.2007,  15:03 Найти цитируемый пост)

1. в WinAPI нет средств для чтения JPEG и PNG
2. в MFC нет средств для чтения JPEG и PNG

Вот поэтому и охота вешаться  smile  Читать сырые байты и обрабатывать  smile  Спасибо archimed7592 за подсказку про библиотеки, сегодня начну ковыряться.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
zkv
Дата 6.11.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 92



Shaggie, соврал я нагло (перемкнуло что-то...), см. выше. 
Работать неудобно, есть какие-то ограничения. 
Плюс еще можно gdi+ использовать, но нужно обеспечить его наличие на машине клиента.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.0967 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.