LINUX.ORG.RU

Web приложение на Qt

 ,


0

2

Что я хочу: запихнуть свое js приложение (react) в бинарник. Причем есть необходимость статической линковки всего и вся, чтобы на выходе получился один единственный бинарник. Собираться все это добро должно на linux, windows и osx.

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

Идеальнее всего подошел бы qt, т.к. плюс ко всему есть необходимость импортировать в приложение кое-какую информацию о сетевой конфигурации компьютера и это очень удобно сделать по средствам QtNetwork.

Вся концепция уперлась в бетонную стену под названием QtWebengine: это собственно тот компонент, который и будет этим миниатюрным браузером. А проблема в том, что эта штука статически не собирается - https://doc.qt.io/qt-5/qtwebengine-platform-notes.html «Static builds are not supported».

Пробовал искать альтернативы в виде интеграции CEF в qt, но нашел только пару устаревших примеров и инструкций, преимущественно применимых для windows.

Подскажите какое-либо готовое решение или пример реализации компонента-браузера, который бы без проблем линковался статически. Или может быть идея мертворожденная и мне стоит смотреть в сторону Electron и ему подобных. Заранее благодарен.


и мне стоит смотреть в сторону Electron

иди и смотри.

Unununij ★★★★ ()
Ответ на: комментарий от UVV

Возможно я не прав, но лично мне так удобнее сделать автообновление: приложение просто перекачает один бинарник и заменит само себя. И не надо думать о зоопарке библиотек.

tr0ll ()

QWebKit через грабли и прочие бубны можно было собрать статически. QWebEngine скорее всего уже нет. Там бинарь будет ростом в 100 с лишком мегов.

EXL ★★★★★ ()
Ответ на: комментарий от tr0ll

При автоообноевлении нужно будет менять только бинарь. Либы можно оставить старые.

Ну и сборка вебкита/webedgine в статику - это то ещё приключение. Лучше даже не пытаться.

RazrFalcon ★★★★★ ()

Или может быть идея мертворожденная и мне стоит смотреть в сторону Electron и ему подобных.

Он тоже не одним файлом идёт.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от tr0ll

приложение просто перекачает один бинарник и заменит само себя.

С динамикой то же самое, если библиотеки те же самые используются.

UVV ★★★★★ ()

Чего бы ты не накопал на эту тему, qt не qt, совет заранее проверяй, нормально ли себя ведет этот *engine. Можешь пару дней убить на системную возню (собирать браузеры – особое удовольствие), и только потом заметить, что все кривое и дергается, хотя в соседнем браузере все ок.

anonymous ()
Ответ на: комментарий от tr0ll

Можно собрать не статически, но с rpath относительно exe-шника и делать обновления заменой содержимого папки (exe-шник и so/dll файлы).

anonymous ()

Причем есть необходимость статической линковки всего и вся...

ѧковебратеебилежѧ

erfea ★★★★★ ()

Зачем тебе QtWebengine? При запуске программы стартуешь http сервак, потом вызываешь браузер по умолчанию с url localhost:8080, например. Профит.

ox55ff ★★★ ()

Посмотри в сторону qtwebkit-ng.

Либо не выпендривайся и поставляй с библиотеками.

Либо возьми qhttpserver, создай сам слушающий сокет на локалхосте и вручную отдавай контент. А запустить можешь обычный браузер через qdesktopservices

ckotinko ☆☆☆ ()
Ответ на: комментарий от anonymous

Хер там. Я с этим rpath натрахался и не советую его юзать ибо он под линухом триггерит баг в динамическом загрузчике. А именно если у тебя две либа или либа и приложуха ссылаются одновременно на третью либу, последняя загрузится в двух экземплярах причем один будет неинициализован.

ckotinko ☆☆☆ ()

js приложение

А тебе точно нужен браузер? Возможно, достаточно движка js, тогда напиши интерфейс на QML/QtQuick.

unC0Rr ★★★★★ ()

Попробуй запаковать в AppImage.

i-rinat ★★★★★ ()

Плохая идея. Сколько ещё нужно плодить браузеров для приложений? Вот когда появится платформа, которая будет запускать один экземпляр браузера для всех таких приложений - тогда ок. Но когда у нас каждое приложение = браузер. Это отстой. И никакой памяти на весь этот зоопарк браузеров-приложений не напасёшься.

А то получается, включаешь систему - запускаешь браузер, включаешь плеер, который тянет свой браузер, включаешь текстовый редактор, который тоже браузер, включаешь Слак - браузер, Скайп - браузер, Телеграм - браузер, торрент - браузер, ...

Это плохой способ писать десктоп софт. Лучше переписать своё react приложение на более нативные технологии, чем делать очередное УГ.

th3m3 ★★★★★ ()
Ответ на: комментарий от unC0Rr

Возможно, достаточно движка js, тогда напиши интерфейс на QML/QtQuick.

V4 - не самый быстрый JS-движок, его сильная сторона это скорость биндингов QObject, но никак не скорость чистого JS. К тому же поддержки ES6 и выше нет и не предвидится, нужны транспайлеры

annulen ★★★★★ ()
Ответ на: комментарий от th3m3

Вот когда появится платформа, которая будет запускать один экземпляр браузера для всех таких приложений - тогда ок.

Уже есть такая. Если, не ошибаюсь, лет 20 существует точно. Называется браузер?

anonymous ()
Ответ на: комментарий от anonymous

Называется Android WebView. Когда на десктопе запилят подобное, тогда ещё можно обратить внимание на это всё. Но тут скорее Android вытеснит десктоп. Браузер - и так понятно.

th3m3 ★★★★★ ()

Заметил, что успешные проекты используют Electron

fehhner ★★★★★ ()
Ответ на: комментарий от annulen

Все собралось, но не работает:

/opt/Qt/5.9.2/Static-64/lib/libWebCore.a:-1: ошибка: error adding symbols: Искажённый архив

Может при сборке что-то напутал? Как собирал:

QT

git clone https://code.qt.io/qt/qt5.git qt64
cd qt64
git checkout v5.9.2
git submodule update --init

./configure -static -platform linux-g++ -prefix /opt/Qt/5.9.2/Static-64 -release -opensource -confirm-license -nomake examples -nomake tests -nomake tools -opengl desktop -make libs -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -qt-xcb -skip qtwebengine -skip qtquick1 -skip qtquickcontrols

make -j9
make install

QtWebKit

git clone git://code.qt.io/qt/qtwebkit.git

cd qtwebkit
mkdir -p WebKitBuild/Release
cd WebKitBuild/Release

cmake -DPORT=Qt -DCMAKE_BUILD_TYPE=Release -DQt5_DIR=/opt/Qt/5.9.2/Static-64/lib/cmake/Qt5 ../..

make -j9
make install

tr0ll ()
Ответ на: комментарий от tr0ll

В данном случае проблема из-за thin archives, они не выключаются автоматом при статической сборке

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Спасибо, помогло. Правда после сборки с -DUSE_THIN_ARCHIVES=OFF натолкнулся уже на новые грабли:

/usr/bin/ld: /opt/Qt/5.9.2/Static-64/lib/libWebCore.a(PNGImageDecoder.cpp.o): неопределённая ссылка на символ «png_get_progressive_ptr@@PNG12_0»
/usr/lib/x86_64-linux-gnu/libpng12.so: error adding symbols: DSO missing from command line

libpng12-0-1.2.54-1ubuntu1 и libpng12-dev-1.2.54-1ubuntu1 установлены. Видимо нужна другая версия этой библиотеки или просто в дистрибутиве что-то поломалось. Буду копать дальше.

tr0ll ()
Ответ на: комментарий от tr0ll

Если это вылезает при линковке приложения с libQtWebKit, то попробуй вот такой патч:

diff --git a/Source/WebKit/PlatformQt.cmake b/Source/WebKit/PlatformQt.cmake
index f0e4acf8a5a..cf5f3670040 100644
--- a/Source/WebKit/PlatformQt.cmake
+++ b/Source/WebKit/PlatformQt.cmake
@@ -473,7 +473,7 @@ if (QT_STATIC_BUILD)
     set(WEBKITWIDGETS_PKGCONGIG_DEPS "${WEBKITWIDGETS_PKGCONGIG_DEPS} Qt5PrintSupport")
     set(WEBKITWIDGETS_PRI_DEPS "${WEBKITWIDGETS_PRI_DEPS} printsupport")
     set(EXTRA_LIBS_NAMES WebCore JavaScriptCore WTF)
-    append_lib_names_to_list(EXTRA_LIBS_NAMES ${LIBXML2_LIBRARIES} ${SQLITE_LIBRARIES} ${ZLIB_LIBRARIES})
+    append_lib_names_to_list(EXTRA_LIBS_NAMES ${LIBXML2_LIBRARIES} ${SQLITE_LIBRARIES} ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${PNG_LIBRARIES})
     if (NOT USE_SYSTEM_MALLOC)
         list(APPEND EXTRA_LIBS_NAMES bmalloc)
     endif ()

annulen ★★★★★ ()
Ответ на: комментарий от tr0ll

А приложение кстати qmake'ом собирается? Можно для ускорения процесса попячить mkspecs/modules/qt_lib_webkit.pri добавив туда недостающие -l флаги

annulen ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.