Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

DLang: Как правильно прилинковать GUI-библиотеку DWT?

#gui #компоновщик #d


В процессе ознакомления с D, появилось желание написать что-нибудь простенькое с
GUI. В качестве GUI-библиотеки выбрал DWT, т.к. кроссплатформенно и является биндингом
с SWT (много обучающего материала по последнему).

Проект был скачан с ГитХаба, собран и перенесен в папку C:\D\. Методом проб и ошибок
была получена работающая команда для сборки демонстрационного окошка с надписью "Hello,
DWT!" посередине:

dmd.exe "..\src\%1" -IC:\\D\\dwt\\imp ^
-JC:\\D\\dwt\\org.eclipse.swt.win32.win32.x86\\res ^
-L+C:\\D\\dwt\\lib\\ -L+org.eclipse.swt.win32.win32.x86.lib ^
-L+dwt-base.lib -L/SUBSYSTEM:windows:4 ^
-L/rc:..\res\resource.res


, что соответствует следующим параметрам в dub.json:

"importPaths": ["C:\\D\\dwt\\imp"],
"stringImportPaths": ["C:\\D\\dwt\\org.eclipse.swt.win32.win32.x86\\res"],
"lflags": ["+C:\\D\\dwt\\lib\\"
   , "+org.eclipse.swt.win32.win32.x86.lib"
   , "+dwt-base.lib", "/SUBSYSTEM:windows:4"
   , "/rc:res\\resource.res"]


Код самой программы: 

import org.eclipse.swt.all;
void main()
{
    auto display = new Display;
    auto shell = new Shell(display);
    shell.setLayout(new GridLayout(4, false));
    auto label = new Label(shell, 0);
    label.setText("Hello, DWT!");
    shell.pack();
    shell.open();
    while (!shell.isDisposed)
        if (!display.readAndDispatch())
            display.sleep();
    display.dispose();
}


И программа собирается в один в один единственный exe без зависимостей и на ура запускается
на ОС от WinXP до Windows8. Но меня терзают серьезные сомнения, что я тут наворотил
лишнего, и можно было бы как-то по-проще. 

Если кто-то разумеет в dmd или dub и в тонкостях их отношений с линковщиком, подскажите,
как в описанной ситуации поступил бы белый человек.
    


Ответы

Ответ 1



Проще будет, если библиотеку добавят в dub-репозиторий. Пока этого не случится, нужно прописывать пути самостоятельно. Шаги, которые нужно сделать. Выбираете место для библиотеки (на вашем примере, это может быть C:\D) Открываете консоль, заходите в выбранную директорию. Следуете инструкции с github: Клонируете репозиторий git clone --recursive git://github.com/d-widget-toolkit/dwt.git Появится папка C:\D\dwt с проектом и зависимостями. Заходите в эту папку cd dwt Выполняете сборку проекта rdmd build base swt. Собственно, теперь можно подключать библиотеку в свой проект. Для компиляции из командной строки нужно будет выполнить dmd main.d -IC:\D\dwt\imp -JC:\D\dwt\res -L+C:\D\dwt\lib\ "-L+org.eclipse.swt.win32.win32.x86.lib" "-L+dwt-base.lib" -L/SUBSYSTEM:WINDOWS:4.0` Именно это и написано в инструкции на гитхабе: dmd main.d -I\imp -J\res -L+\lib\ ^ "-L+org.eclipse.swt.win32.win32.x86.lib" "-L+dwt-base.lib" ^ -L/SUBSYSTEM:WINDOWS:4.0 - это путь к директории самого dwt, лезть к res в org.eclipse.swt.win32.win32.x86 не требуется, так как нужный res лежит в самой dwt. Итог у вас почти правильный. Если внимательно следовать инструкции к библиотеке, то ошибок никаких нет. Для того, чтобы в будущем не прописывать все пути/зависимости в проекте, можно сделать "пустой" проект и впоследствии просто копировать его в качестве нового. P.S. Лично я использую библиотеку DlangUI. Кроссплатформенная, с широкими возможностями, интерфейсы можно удобно собирать, используя разметку DML (похожую на QML) и др. Есть статья от автора. P.P.S. Обязательно используйте фигурные скобки во while while (!shell.isDisposed) { if (!display.readAndDispatch()) display.sleep(); } Иначе, добавив ещё какую-нибудь строку кода, можно получить некорректную логику программы.

Комментариев нет:

Отправить комментарий