The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Раздел полезных советов: Как подружить plPlot и wxWidgets по..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Как подружить plPlot и wxWidgets по..."  +1 +/
Сообщение от auto_tips (?), 08-Ноя-18, 11:23 
++ 0) Введение.

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

++ 0.1) wxWidgets

В сети очень много материала про данную библиотеку, поэтому отмечу здесь только основной плюс, что она не имеет лицензионных ограничений в отличие от аналогичного продукта в виде библиотеки Qt, и позволяет легко писать свободное и коммерческое ПО любому желающему.

Со всей богатой документацией можно ознакомиться на [[https://www.wxwidgets.org/ официальном сайте]].

++ 0.2) plPlot

plPlot так же является свободно распространяемой  (LGPL) библиотекой, предназначенной для построения графиков функций в 2х-мерном и 3х-мерном пространствах, различных видов и форм.

В связке с библиотекой wxWidgets дает практически неограниченные возможности по визуализации данных в различных областях применения, от систем мониторинга до финансовых приложений, калькуляторов и расчетных систем.
[[http://plplot.sourceforge.net/ Ссылка на официальный сайт]].

Обе библиотеки распространяются в виде исходного кода, а значит на OS Windows, необходимо будет их собрать и скомпилировать при помощи утилиты CMake и компилятора gcc из пакета MinGW32.

На момент написания статьи самые свежие версии необходимого ПО были:

*** CMake - 3.12.4;
*** Mingw BASE-bin - 2013072200, gcc-c++ - 6.3.0-1;
*** wxWidgets - 3.0.4 Stable;
*** plPlot - 5.13.0;
*** IDE code::Blocks - 17.12;

Рекомендую использовать именно данную конфигурацию для более предсказуемого результата.

++ 1) Установка утилит и компиляторов

++ 1.1)Cmake

Качаем установщик в соответствии с разрядностью своей операционной системы
*** [[https://cmake.org/files/v3.12/cmake-3.12.4-win32-x86.msi x32]]
*** [[https://cmake.org/files/v3.12/cmake-3.12.4-win64-x64.msi x64]]

Запускаем..., далее..., далее..., после установки необходимо добавить в переменную []%PATH%[] путь к каталогу "CMake\\bin\\", в стандартной установке это "C:\\Program Files\\CMake\\bin", сделать это можно через
Пуск/ Панель управления/ Система/ Дополнительные параметры/ Переменные среды.

++ 1.2) MinGW32

На [[http://www.mingw.org/ официальном сайте]] забираем утилиту "MinGW Installation Manager (mingw-get)" из раздела "Downloads". Запускаем ее и в открывшемся окне через правую кнопку мыши отмечаем для установки пакеты "[]mingw32-base-bin[]" и "[]mingw32-gcc-g++-bin[]", затем в меню "[]Installaton[]" жмем на "[]Apply Changes[]" и дожидаемся установки всех пакетов.

В случае сбоя недостающие библиотеки можно докачать с [[https://sourceforge.net/projects/mingw/files/ репозитория]] MinGW на sourceforge.net.

Нужно убедиться в том, что установилась библиотека "MinGW\\lib\\libgdiplus.a" и заголовочный файл "MinGW\\include\\gdiplus.h".
Так же добавляем путь к каталогу "bin\\" в переменную []%PATH%[], в стандартной установке это "C:\\MinGW\\bin"

++ 2) Установка библиотеки wxWidgets

На сайте библиотеки в разделе [[https://www.wxwidgets.org/downloads/  Downloads�... качаем установочный файл с исходными текстами и распаковываем.. Путь по-умолчанию будет в корне диска "c:\\wxWidgets-3.0.4\\", и желательно, чтобы он не содержал кириллицы и пробелов.

Перед установкой редактируем файл "[]wxWidgets-3.0.4\\include\\wx\\msw\\setup.h[]", меняем в нем переменную []wxUSE_GRAPHIC_CONTEXT[]=0 на 1 для всех компиляторов. Затем копируем этот "setup.h" в каталог "[]wxWidgets-3.0.4\\include\\wx\\[]"

По невыясненным причинам компилятор выдает ошибку при сборке библиотеки, чтобы ее избежать редактируем "[]MinGW\\include\\stdio.h[]". Нужно закомментировать строку 345:
  
   // extern int __mingw_stdio_redirect__(snprintf)(char*, size_t, const char*, ...);

Далее, нужно открыть командную строку через []Пуск[]-[]Выполнить[] - []cmd[]

В командной строке:

   cd c:\\wxWidgets-3.0.4\\build\\msw
   mingw32-make -f makefile.gcc SHARED=1 UNICODE=1 BUILD=release MONOLITHIC=0

Компиляция обычно занимает до получаса, в результате в каталоге "wxWidgets-3.0.4\\lib\\gcc_dll" дожны появиться бинарные файлы библиотек. Можно идти далее...


++ 3) Установка библиотеки plPlot

Качаем исходники с [[https://sourceforge.net/projects/plplot/files/plplot/ офциального сайта]], распаковываем во временный каталог "c:\\Temp\\" или другой,
но только не в корень диска, так как там, в результате, будет бинарная сборка.

Для успешной компиляции необходимо произвести следующие действия:

*** Скопировать из "wxWidgets-3.0.4\\lib\\gcc_dll\\" файлы "[]wxbase30u_gcc_custom.dll[]" и "[]wxmsw30u_core_gcc_custom.dll[]" в каталог "Temp\\plplot-5.13.0\\dll\\"
*** Отредактировать "Temp\\plplot-5.13.0\\drivers\\wxwidgets_dev.cpp" строку под номером []647[] []rand_s(&m_seed);[] и привести ее к виду:

   m_seed = rand();

Сохранить файл.

В командной строке Windows cmd:

   cd c:\\Temp\\plplot-5.13.0\\
   cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=c:\\plplot\\ -DENABLE_wxwidgets=ON -DPLD_wxwidgets=ON

Необходимо убедиться в отсутствии ошибок и что переменные установлены верно:

   .... a lot of output ....
   wxWidgets_FOUND=TRUE
   .... a lot of output ....
   ENABLE_wxwidgets=ON

Если что-то пошло не так, нужно выяснить причину, удалить каталог "CMakeFiles\\" и файл "CMakeCache.txt" и запустить CMake повторно.

Опять переходим в командную строку:

   mingw32-make

Дожидаемся успешной компиляции и в []cmd[] от имени Администратора:

   cd c:\\Temp\\plplot-5.13.0\\
   mingw32-make install

После указанных действий появляется каталог "[]c:\\plplot\\[]" c бинарной сборкой библиотеки и заголовочными файлами.

++ 4) Установка среды разработки приложений Code::Blocks

Здесь особых нюансов не предвидется. Качаем C::B с [[http://www.codeblocks.org официального сайта]], запускаем установщик и убеждаемся, что система увидела
компилятор.
Запускаем IDE с рабочего стола двойным щелчком.

++ 5) Проба пера: "Hello, World!"

На начальном экране Code::Blocks нажимаем "Create New Project", в выпадающем списке "Category"->"GUI", нажать "new wxWidgets Project".

В диалоге нужно выбрать версию wxWidgets-3.0.x, далее, директорию проекта и название, имя автора, далее установить буллеты:

   Preferred GUI Builder - [o]wxSmith
   Application type - [o]Frame based

далее, "wxWidgets location" - "c:\\wxWidgets-3.0.4" , далее, установить галочки в "wxWidgets library settings":

   [V] Use wxWidgets dll
   [V] Enable Unicode

[]Finish.[]

Раскроется окно GUI-Builder'а wxSmith. Здесь в окне "[]Management[]" переходим во вкладку "[]Projects[]" и правым щелчком мыши на названии проекта в контекстном выбираем "[]Build options[]".

Откроется окно "[]Project build options[]", на вкладке "[]Linker settings[]" добавляем 3 библиотеки кнопкой "Add" это (одной строкой):

   plplot.dll;plplotcxx.dll;plplotwxwidgets.dll;

на вкладке "[]Search directories[]":

*** для "Compiler" добавить "c:\\plplot\\include",
*** для "Linker" добавить "c:\\plplot\\lib".

++ 5.1) Можно приступить к программированию..

В дереве проекта открываем файл "[]Headers[] - []Main.h[]" и добавляем заголовки:

  #include <wx/dc.h>
  #include <wx/dcclient.h>
  #include <wx/dcmemory.h>
  #include <plplot/wxPLplotstream.h>

В секции private класса Фрейма пишем:

   private:
     int w, h;
        
     wxBitmap bmp;
     wxMemoryDC mdc;
     wxPLplotstream pls;

Открываем файл "Sources - Main.cpp" и в теле конструктора Фрейма testFrame::testFrame(wxWindow* parent,wxWindowID id) после служебного кода вставляем:

   GetSize(&w, &h);

   bmp.Create( w, h, -1 );
   mdc.SelectObject(bmp);

   if(! pls.IsValid()){
     pls.Create((wxDC*)&mdc, w, h, wxPLPLOT_NONE);
   }

   const int NSIZE = 80;
   PLFLT x[NSIZE], y[NSIZE];

   x[0] = (-1) * NSIZE/4;
   y[0] = x[0] * x[0];
   for(int i=1; i < NSIZE; i++){
     x[i] = x[i - 1] + 0.5;
     y[i] = x[i] * x[i];
   }
   pls.env(-20., 20., -10., 100, 0, 1);

   pls.width(2);
   pls.col0(3);
   pls.line(NSIZE, x, y);

Затем, необходимо в окне "Management" на вкладке "Resources" открыть wxSmith, выделить главное окно и создать обработчик события []EVT_PAINT[] в разделе "{}" Events. Функция автоматически называется "OnPaint".

В ее теле вводим код:

   void testFrame::OnPaint(wxPaintEvent& event)
   {
     int width, height;
     GetSize( &width, &height );
     height = height;
    
     // Check if we window was resized (or dc is invalid)
     if((w != width) || (w != height) ) {
       w = width;
       h = height;

       mdc.SelectObject( wxNullBitmap );

       bmp.Create(w,h, mdc);
       mdc.SelectObject(bmp);
       pls.SetSize( width, height );

       pls.replot();
       Refresh(false);
     }

     wxPaintDC dc(this);
     dc.Blit(0,0,w,h,(wxDC*)&mdc,0,0);
   }

Для запуска приложения потребуются бинарники всех библиотек, так что копируем из "wxWidgets-3.0.4\\lib\\gcc_dll\\" файлы "wxbase30u_gcc_custom.dll" и "wxmsw30u_core_gcc_custom.dll", из "plplot\\bin" все 5 dll файлов и из "plplot\\lib\\plplot5.13.0\\drivers" файл "wxwidgets.dll" в каталог проекта "bin\\Debug", туда, где будет собран основной .exe файл.

Итого, минимальный список библиотек:

*** libcsirocsa.dll
*** libplplot.dll
*** libplplotcxx.dll
*** libplplotwxwidgets.dll
*** libqsastime.dll
*** wxwidgets.dll
*** wxmsw30u_gcc_custom.dll
*** wxmsw30u_core_gcc_custom.dll

Теперь можно спокойно собрать проект и запустить бинарный файл. в итоге получается такая симпатичная парабола.

[[IMG /opennews/pics_base/0_1541654933.png]]


По вопросам сборки библиотек, прошу обращаться на почту автора xsrc@mail.ru.

URL:
Обсуждается: http://www.opennet.dev/tips/info/3082.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от trolleybusemail (?), 08-Ноя-18, 11:23   +/
В MSYS2 и wxWidgets, и plPlot идут из коробки: https://github.com/msys2/msys2/wiki/Packages

Так что это, вероятно, решение получше, чем самому собирать, тем более что встроенный в MSYS2 cmake их увидит сразу, если в проекте есть find_package

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #7

2. Сообщение от Аноним (2), 08-Ноя-18, 12:53   +/
>что она не имеет лицензионных ограничений в отличие от аналогичного продукта в виде библиотеки Qt, > и позволяет легко писать свободное и коммерческое ПО любому желающему

LGPL кому-то не даёт использовать Qt в проприетарном ПО?

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #3

3. Сообщение от Аноним (3), 08-Ноя-18, 13:31   +/
Могу ошибаться, но насколько мне известно фришная версия qt имеет ограничения в использовании, в отличие от более либеральной wx. Подробнее на странице https://www.qt.io/download
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #8

4. Сообщение от alexpn (ok), 11-Ноя-18, 12:21   +/
Прикольно . под винду можно компилить !
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5, #6

5. Сообщение от Аноним (7), 12-Ноя-18, 19:42   +/
Можно, даже под МакОсь собрать.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4

6. Сообщение от Аноним (7), 12-Ноя-18, 19:47   +/
А можно накидать элементов управления и запилить интерактивный график.. В 3D.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4

7. Сообщение от Аноним (7), 12-Ноя-18, 20:04   +/
Может, потребуется собрать либу с особыми параметрами.. всякое бывает. Этот вариант более гибкий, по сравнению с пакетами MSYS2.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #13

8. Сообщение от тоже Аноним (ok), 16-Ноя-18, 20:22   +/
Насколько известно мне, это различие между библиотеками кануло в лету.
Сейчас обе под LGPL, что, кстати, некоторые ограничения и на wx накладывает (например, запрет статической линковки).
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #9

9. Сообщение от Qwerty17email (?), 21-Ноя-18, 10:10   +/
В wxWidgets по этому поводу оговорка есть. Они официально разрешают статическую линковку.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8 Ответы: #10

10. Сообщение от тоже Анонимemail (ok), 21-Ноя-18, 11:00   +/
> В wxWidgets по этому поводу оговорка есть. Они официально разрешают статическую линковку.

Да? Не то, чтобы я сильно переживал, предполагая, что последние лет десять нарушаю условия лицензии, но, пожалуй, приятно знать, что это не так.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9

11. Сообщение от coolguy (?), 16-Дек-18, 17:50   +/
в vcpkg есть порты и для plplot и для wxWidgets, кстати говоря
Ответить | Правка | Наверх | Cообщить модератору

12. Сообщение от Аноним (12), 16-Янв-19, 02:07   +/
MinGW сдох, следует использовать MinGW-w64
Ответить | Правка | Наверх | Cообщить модератору

13. Сообщение от rico (ok), 22-Янв-19, 14:40   +/
Там есть pacman и PKGBUILD, а любителям распиихивать бинарники в ОС я бы ломал руки.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7

14. Сообщение от Александрemail (??), 29-Янв-21, 16:54   +/
Спасибо. Очень актуально.
Все собралось, но на выходе черный экран.
Есть ли какие изменения в процессе сборки для более свежих версий
CMake - 3.19.4;
codeblocks-20.03-32bit-setup.exe
wxWidgets - 3.1.4 Stable;
plPlot - 5.15.0;
IDE code::Blocks - 20.03;
у меня не заработало. (то что Вами рекомендовано пока не ставил)
Ответить | Правка | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру