LINUX.ORG.RU

Qt5 и старые дистры. Ошибка при сборке

 ,


0

1

Qt 5.3 под CentOS 5 - собрано
Qt 5.6 под SLES 11 и openSUSE 11.4 - собрано
Qt 5.9 - в процессе

Когда-то я компилировал каждый релиз Qt5, а теперь - только LTS-релизы. После 5.9 скомпилирую следующий LTS-релиз 5.11

Почему под старые дистры? Для обратной совместимости. Собранное в старом, работает в новом. Например R-Studio имеет низкие системные требования: нужна система то ли с ядром 2.6.9, то ли 2.6.18, и при этом GUI на Qt4. Было бы здорово обновить GUI до Qt5 так, чтобы требования к минимально необходимой ОС не повышались

Во время компилирования Qt 5.9 возникла ошибка сборки с libproxy:

kernel/qnetworkproxy_libproxy.cpp: In member function 'QList<QUrl> QLibProxyWrapper::getProxies(const QUrl&)':
kernel/qnetworkproxy_libproxy.cpp:158:74: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
             data.proxies = px_proxy_factory_get_proxies(factory, data.url);
                                                                          ^
In file included from kernel/qnetworkproxy_libproxy.cpp:52:0:
/usr/include/proxy.h:77:8: error:   initializing argument 2 of 'char** px_proxy_factory_get_proxies(pxProxyFactory*, char*)' [-fpermissive]
 char **px_proxy_factory_get_proxies(pxProxyFactory *self, char *url);
        ^
kernel/qnetworkproxy_libproxy.cpp: In member function 'virtual void QLibProxyWrapper::run()':
kernel/qnetworkproxy_libproxy.cpp:182:78: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
         request->proxies = px_proxy_factory_get_proxies(factory, request->url);
                                                                              ^
In file included from kernel/qnetworkproxy_libproxy.cpp:52:0:
/usr/include/proxy.h:77:8: error:   initializing argument 2 of 'char** px_proxy_factory_get_proxies(pxProxyFactory*, char*)' [-fpermissive]
 char **px_proxy_factory_get_proxies(pxProxyFactory *self, char *url);
        ^
make[2]: *** [.obj/qnetworkproxy_libproxy.o] Error 1

Причина - в старой версии библиотеки libproxy, и её *.h-файлов. Я из-за этого уже накладывал патч на Firefox 52

Решить можно отключением поддержки libproxy в configure, или обновлением libproxy в OBS-репозитории. Но может возможно пропатчить? Дайте совет :-) У меня ничего не получилось, поэтому я обращаюсь за помощью к вам. Судя по тому, что я нашёл по этой ошибке - она заключается в том, что, в зависимости от настроек компилятора, он может выдавать разный результат на этом месте. Помогите, пожалуйста, исправить!

Исходник вот, а *.h-файлы libproxy доступны по ссылке выше. Может, на решение проблемы натолкнёт патч для Firefox? Там тоже что-то, связанное с «char»

★★★★★

Последнее исправление: ZenitharChampion (всего исправлений: 5)

Не понял, тебе нужно:

$ diff -Nuar qnetworkproxy_libproxy_orig.cpp qnetworkproxy_libproxy.cpp 
--- qnetworkproxy_libproxy_orig.cpp     2019-02-24 17:43:42.352257366 +0700
+++ qnetworkproxy_libproxy.cpp  2019-02-24 17:45:16.568091386 +0700
@@ -155,7 +155,7 @@
             data.replyReady.acquire();
         } else {
             // non-threaded mode
-            data.proxies = px_proxy_factory_get_proxies(factory, data.url);
+            data.proxies = px_proxy_factory_get_proxies(factory, const_cast<char *>(data.url));
         }
     }
 
@@ -179,7 +179,7 @@
         requestReady.acquire();
         if (isInterruptionRequested())
             break;
-        request->proxies = px_proxy_factory_get_proxies(factory, request->url);
+        request->proxies = px_proxy_factory_get_proxies(factory, const_cast<char *>(request->url));
         request->replyReady.release();
     }
 

Или что-то другое?

Да и исходники этой libproxy посмотреть было бы желательно, чтобы удостовериться, что в px_proxy_factory_get_proxies() нет никаких изменений char *url.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Твой патч наложился. Уже хорошо :-) Сейчас буду смотреть, соберётся или нет.

Вот хороший ты человек! Обычно мне пишут «я знаю ответ, но помогать тебе не буду, потому что у тебя ОСь старая, а это плохо». Хотя нужно так мало сделать. Спасибо, а то у меня у самого не получилось...

Компилируется, о результатах напишу. Исходник вот, я дал ссылку на RPM-ки, думая что её можно распаковать.

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

А можешь посмотреть ещё одну ошибку? Тоже [-fpermissive]

Я успешно скомпилировал Qt 5.9 и начал компилировать Qt 5.10. Но вдруг перестало собираться, ругаясь на SSL. Раньше (до версии 5.10) ошибки на этом месте не было...

Ошибка вот такая:

g++ -c -pipe -O3 -std=c++11 -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -D_REENTRANT -fPIC -DQT_NO_USING_NAMESPACE -DQT_NO_FOREACH -DENABLE_PIXMAN_DRAWHELPERS -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_GUI_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_CORE_LIB -I. -I../../include -I../../include/QtGui -I../../include/QtGui/5.10 -I../../include/QtGui/5.10/QtGui -isystem /usr/include/libdrm -I../../include/QtCore/5.10 -I../../include/QtCore/5.10/QtCore -I../../include/QtCore -I.moc -isystem /usr/include/libpng12 -I../3rdparty/harfbuzz-ng/include -isystem /usr/include/pgsql -isystem /usr/include/pgsql/server -isystem /usr/include/mysql -I../../mkspecs/linux-g++ -o .obj/qplatformgraphicsbuffer.o kernel/qplatformgraphicsbuffer.cpp
In file included from ssl/qsslsocket_openssl_symbols.cpp:58:0:
ssl/qsslsocket_openssl_symbols.cpp: In function 'char* q_SSL_CIPHER_description(const SSL_CIPHER*, char*, int)':
ssl/qsslsocket_openssl_symbols_p.h:193:58: error: invalid conversion from 'const SSL_CIPHER* {aka const ssl_cipher_st*}' to 'SSL_CIPHER* {aka ssl_cipher_st*}' [-fpermissive]
     ret q_##func(arg1, arg2, arg3) { funcret func(a, b, c); }
                                                          ^
ssl/qsslsocket_openssl_symbols.cpp:384:1: note: in expansion of macro 'DEFINEFUNC3'
 DEFINEFUNC3(char *, SSL_CIPHER_description, const SSL_CIPHER *a, a, char *b, b, int c, c, return 0, return)
 ^
In file included from ../../include/QtNetwork/5.10/QtNetwork/private/../../../../../src/network/ssl/qsslcontext_openssl_p.h:60:0,
                 from ../../include/QtNetwork/5.10/QtNetwork/private/qsslcontext_openssl_p.h:1,
                 from ssl/qsslsocket_p.h:62,
                 from ssl/qsslsocket_openssl_p.h:70,
                 from ssl/qsslsocket_openssl_symbols_p.h:72,
                 from ssl/qsslsocket_openssl_symbols.cpp:58:
/usr/include/openssl/ssl.h:1549:7: error:   initializing argument 1 of 'char* SSL_CIPHER_description(SSL_CIPHER*, char*, int)' [-fpermissive]
 char *SSL_CIPHER_description(SSL_CIPHER *,char *buf,int size);
       ^

Вот патч, добавляющий код, после которого начались проблемы. Патч озаглавлен «OpenSSL 1.1 backend», но, как я понял, поддержку более старых версий не удаляли. Наверняка там есть условие «if >= 1.1» и «else». И наверное, старый код меняли (раз уж начала появляться ошибка). Ориентируясь при этом на OpenSSL 1.0 и новее, а у меня 0.9.8. Исходник 1.0, 0.9.8, заголовочные файлы 1.0, 0.9.8

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 2)
Ответ на: комментарий от EXL

Похоже что я зря тебя побеспокоил. Я открыл патч, после которого начинаются проблемы. И увидел это:

@@ -1503,14 +1316,8 @@ QSslCipher QSslSocketBackendPrivate::ses
 {
     if (!ssl)
         return QSslCipher();
-#if OPENSSL_VERSION_NUMBER >= 0x10000000L
-    // FIXME This is fairly evil, but needed to keep source level compatibility
-    // with the OpenSSL 0.9.x implementation at maximum -- some other functions
-    // don't take a const SSL_CIPHER* when they should
-    SSL_CIPHER *sessionCipher = const_cast<SSL_CIPHER *>(q_SSL_get_current_cipher(ssl));
-#else
-    SSL_CIPHER *sessionCipher = q_SSL_get_current_cipher(ssl);
-#endif
+
+    const SSL_CIPHER *sessionCipher = q_SSL_get_current_cipher(ssl);
     return sessionCipher ? QSslCipher_from_SSL_CIPHER(sessionCipher) : QSslCipher();
 }
 

Похоже, что они намеренно удалили код поддержки OpenSSL 0.9.8, потому что была прекращена официальная поддержка. И осталась только неофициальная в дистрах.

ZenitharChampion ★★★★★
() автор топика

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

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

Попробуй заюзать OpenSSL 1.1 скомпилированную в static’е. Видимо поддержку 0.9.8 давно уже сломали.

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

Когда OpenSSL было только два, 0.9.8 и 1.0, то мне кажется, что Qt5 мог быть скомпилирован с каким-то одним из них, а работать потом с обеими версиями. Сейчас объясню

    -no-openssl ......... Do not compile support for OpenSSL.
    -openssl ............ Enable run-time OpenSSL support.
    -openssl-linked ..... Enabled linked OpenSSL support.

Когда компилируешь с третьей опцией, то ldd показывает, что библиотека QtNetwork зависит от libssl.so.0.9.8. Или 1.0, с какой скомпилируешь. А когда со второй, то не показывает. Тогда я ожидал, что если я сделаю strings libQtNetwork.so.5 | grep ssl, то я увижу конктерную версию, которая нужна, будь то 0.9.8 или 1.0. Но я этого не увидел. Из-за чего предположил, что библиотека может работать с обеими - какую найдёт, ту и будет использовать

Звучит неправдоподобно, конечно

В общем, буду собирать с 1.0, и надеяться, что мою системную 0.9.8 библиотека увидит и будет использовать

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

хм, вроде run-time это и есть как раз «какую найдет». Должно работать. Главное чтоб обязательно присутствовала библиотека.

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

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

Так все дистрибутивы линукса разрабоатываемые community и НКО и есть те самые сборки от васяна, зачем вы ими пользуетесь?

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