The OpenNET Project / Index page

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

Как подружить plPlot и wxWidgets под ОС Windows
0) Введение.

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

0.1) wxWidgets

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

Со всей богатой документацией можно ознакомиться на официальном сайте.

0.2) plPlot

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

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

Обе библиотеки распространяются в виде исходного кода, а значит на 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 Качаем установщик в соответствии с разрядностью своей операционной системы
  • x32
  • x64 Запускаем..., далее..., далее..., после установки необходимо добавить в переменную %PATH% путь к каталогу "CMake\\bin\\", в стандартной установке это "C:\\Program Files\\CMake\\bin", сделать это можно через Пуск/ Панель управления/ Система/ Дополнительные параметры/ Переменные среды. 1.2) MinGW32 На официальном сайте забираем утилиту "MinGW Installation Manager (mingw-get)" из раздела "Downloads". Запускаем ее и в открывшемся окне через правую кнопку мыши отмечаем для установки пакеты "mingw32-base-bin" и "mingw32-gcc-g++-bin", затем в меню "Installaton" жмем на "Apply Changes" и дожидаемся установки всех пакетов. В случае сбоя недостающие библиотеки можно докачать с репозитория MinGW на sourceforge.net. Нужно убедиться в том, что установилась библиотека "MinGW\\lib\\libgdiplus.a" и заголовочный файл "MinGW\\include\\gdiplus.h". Так же добавляем путь к каталогу "bin\\" в переменную %PATH%, в стандартной установке это "C:\\MinGW\\bin" 2) Установка библиотеки wxWidgets На сайте библиотеки в разделе 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 Качаем исходники с офциального сайта, распаковываем во временный каталог "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 с официального сайта, запускаем установщик и убеждаемся, что система увидела компилятор. Запускаем 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 Теперь можно спокойно собрать проект и запустить бинарный файл. в итоге получается такая симпатичная парабола. По вопросам сборки библиотек, прошу обращаться на почту автора xsrc@mail.ru.
  •  
    06.11.2018 , Автор: KoD
    Ключи: plplot, wxwidgets, windows, graph / Лицензия: CC-BY
    Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка

    Обсуждение [ RSS ]
     
  • 1.1, trolleybus (?), 11:23, 08/11/2018 [ответить]    [к модератору]
  • +/
    В MSYS2 и wxWidgets, и plPlot идут из коробки: https://github.com/msys2/msys2/wiki/Packages

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

     
     
  • 2.7, Аноним (7), 20:04, 12/11/2018 [^] [ответить]    [к модератору]
  • +/
    Может, потребуется собрать либу с особыми параметрами.. всякое бывает. Этот вариант более гибкий, по сравнению с пакетами MSYS2.
     
  • 1.2, Аноним (2), 12:53, 08/11/2018 [ответить]     [к модератору]
  • +/
    LGPL кому-то не даёт использовать Qt в проприетарном ПО ... весь текст скрыт [показать]
     
     
  • 2.3, Аноним (3), 13:31, 08/11/2018 [^] [ответить]    [к модератору]  
  • +/
    Могу ошибаться, но насколько мне известно фришная версия qt имеет ограничения в использовании, в отличие от более либеральной wx. Подробнее на странице https://www.qt.io/download
     
     
  • 3.8, тоже Аноним (ok), 20:22, 16/11/2018 [^] [ответить]    [к модератору]  
  • +/
    Насколько известно мне, это различие между библиотеками кануло в лету.
    Сейчас обе под LGPL, что, кстати, некоторые ограничения и на wx накладывает (например, запрет статической линковки).
     
     
  • 4.9, Qwerty17 (?), 10:10, 21/11/2018 [^] [ответить]    [к модератору]  
  • +/
    В wxWidgets по этому поводу оговорка есть. Они официально разрешают статическую линковку.
     
     
  • 5.10, тоже Аноним (ok), 11:00, 21/11/2018 [^] [ответить]    [к модератору]  
  • +/
    > В wxWidgets по этому поводу оговорка есть. Они официально разрешают статическую линковку.

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

     
  • 1.4, alexpn (ok), 12:21, 11/11/2018 [ответить]    [к модератору]  
  • +/
    Прикольно . под винду можно компилить !
     
     
  • 2.5, Аноним (7), 19:42, 12/11/2018 [^] [ответить]    [к модератору]  
  • +/
    Можно, даже под МакОсь собрать.
     
  • 2.6, Аноним (7), 19:47, 12/11/2018 [^] [ответить]    [к модератору]  
  • +/
    А можно накидать элементов управления и запилить интерактивный график.. В 3D.
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



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