У меня есть коммерческие лицензии на Qt и PyQt, и я пытаюсь создать статические версии всего необходимого программного обеспечения для создания автономной исполняемой программы, которую я сейчас пишу с использованием Python3 и PyQt. Я планирую собирать с помощью VirtualBox и, вероятно, буду ориентироваться на Linux и Windows. В настоящее время я пытаюсь настроить среду сборки Linux.
Первым шагом для этого является создание корневого каталога системы, как описано здесь: http://pyqt.sourceforge.net/Docs/pyqtdeploy/build_sysroot.html
Я использую build-sysroot.py, который представлен здесь: https://www.riverbankcomputing.com/hg/pyqtdeploy/file/tip/Developers/build-sysroot.py
Следуя инструкциям в первой ссылке, я создал корневой каталог (sysroot-linux), содержащий каталог с именем src, в котором есть папки с исходным кодом в g-архиве для Qt5, PyQt5, sip, PyQtChart и Python.
Я использую 64-разрядную версию Xubuntu 16.04 в VBox вместе с коммерческими PyQt-5.8, коммерческими PyQtChart-5.8, Python-3.6.1, коммерческими Qt-5.8.0 и sip-4.19.2. Я скопировал информацию о своей лицензии Qt в файл, расположенный в /home/(user)/.qt-license. Я скопировал файл лицензии PyQt в каталог PyQt/sip, заархивированный g-zip.
Когда я запускаю следующую команду в терминале:
python3 build-sysroot.py --build qt python sip pyqt5 pyqtchart --sysroot /home/(user)/(path-to)/sysroot-linux
Где (user) — имя пользователя, а (path-to) — путь к корневому каталогу системы.
Примерно через 1,5 часа в процессе я получаю сообщение об ошибке во время сборки PyQt, которое гласит:
Makefile:953: recipe for target 'sipQtNetworkpart1.o' failed
make[1]: \*** [sipQtNetworkpart1.o] Error 1
make[1]: Leaving directory '/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork'
Makefile:414: recipe for target 'sub-QtNetwork-make_first-ordered' failed
make: \*** [sub-QtNetwork-make_first-ordered] Error 2
Traceback (most recent call last):
File "build-sysroot.py", line 1073, in <module>
build_pyqt5(host, target, args.all, args.debug)
File "build-sysroot.py", line 735, in build_pyqt5
host.run(host.make)
File "build-sysroot.py", line 313, in run
subprocess.check_call(args)
File "/usr/lib/python3.5/subprocess.py", line 581, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '('make',)' returned non-zero exit status 2
Компания, которая продает PyQt, сообщила мне, что моя сборка Qt не поддерживает SSL, но в моем файле конфигурации PyQt он включен.
Поэтому я попытался отключить QtNetwork в конфигурации PyQt, используя «disable = QtNetwork» в build-sysroot.py, функцию «build_pyqt5» в «args» (тип списка python; см. Строку 721 1-й ссылки), но безрезультатно — опция кажется, был проигнорирован, и попытка сборки QtNetwork все равно была предпринята.
Я на связи с компанией, которая продает PyQt, но я хотел обратиться к более широкому сообществу программистов, чтобы узнать, успешно ли кто-то делал это в прошлом, и, возможно, мог бы поделиться своим мнением. Буду признателен за любую оказанную помощь.
Спасибо, Крис
РЕДАКТИРОВАТЬ 1 Вот полный вывод ошибки, изменены только пути к каталогам:
make[1]: Entering directory '/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork'
g++ -c -pipe -O2 -fPIC -std=gnu++11 -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -D_REENTRANT -DSIP_PROTECTED_IS_PUBLIC -Dprotected=public -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I. -I../../../include/python3.6 -I../../../Qt/include -I../../../Qt/include/QtNetwork -I../../../Qt/include/QtCore -I. -I../../../Qt/mkspecs/linux-g++ -o sipQtNetworkpart1.o sipQtNetworkpart1.cpp
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp: In function ‘PyObject* meth_QNetworkReply_sslConfiguration(PyObject*, PyObject*)’:
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp:1094:55: error: ‘const class QNetworkReply’ has no member named ‘sslConfiguration’
sipRes = new ::QSslConfiguration(sipCpp->sslConfiguration());
^
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp:1094:73: error: invalid use of incomplete type ‘class QSslConfiguration’
sipRes = new ::QSslConfiguration(sipCpp->sslConfiguration());
^
In file included from ../../../Qt/include/QtNetwork/QNetworkRequest:1:0,
from ../../../Qt/include/QtNetwork/qnetworkreply.h:48,
from /home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/sip/QtNetwork/qnetworkreply.sip:18:
../../../Qt/include/QtNetwork/qnetworkrequest.h:52:7: note: forward declaration of ‘class QSslConfiguration’
class QSslConfiguration;
^
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp: In function ‘PyObject* meth_QNetworkReply_setSslConfiguration(PyObject*, PyObject*)’:
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp:1120:21: error: ‘class QNetworkReply’ has no member named ‘setSslConfiguration’
sipCpp->setSslConfiguration(*a0);
^
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp: In function ‘PyObject* meth_QNetworkReply_ignoreSslErrors(PyObject*, PyObject*)’:
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp:1162:40: error: no matching function for call to ‘QNetworkReply::ignoreSslErrors(const QList<QSslError>&)’
sipCpp->ignoreSslErrors(*a0);
^
In file included from /home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/sip/QtNetwork/qnetworkreply.sip:18:0:
../../../Qt/include/QtNetwork/qnetworkreply.h:154:18: note: candidate: virtual void QNetworkReply::ignoreSslErrors()
virtual void ignoreSslErrors();
^
../../../Qt/include/QtNetwork/qnetworkreply.h:154:18: note: candidate expects 0 arguments, 1 provided
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp: In function ‘PyObject* meth_QNetworkAccessManager_connectToHostEncrypted(PyObject*, PyObject*, PyObject*)’:
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp:12735:45: error: incomplete type ‘QSslConfiguration’ used in nested name specifier
{sipName_PutOperation, static_cast<int>( ::QNetworkAccessManager::PutOperation), 55},
^
/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork/sipQtNetworkpart1.cpp:12747:21: error: ‘class QNetworkAccessManager’ has no member named ‘connectToHostEncrypted’
{"encrypted(QNetworkReply*)", "\1encrypted(self, QNetworkReply)", 0, 0},
^
Makefile:953: recipe for target 'sipQtNetworkpart1.o' failed
make[1]: *** [sipQtNetworkpart1.o] Error 1
make[1]: Leaving directory '/home/(user)/(path-to)/sysroot-linux/build/PyQt5_commercial-5.8/QtNetwork'
Makefile:414: recipe for target 'sub-QtNetwork-make_first-ordered' failed
make: *** [sub-QtNetwork-make_first-ordered] Error 2
Traceback (most recent call last):
File "build-sysroot.py", line 1073, in <module>
build_pyqt5(host, target, args.all, args.debug)
File "build-sysroot.py", line 735, in build_pyqt5
host.run(host.make)
File "build-sysroot.py", line 313, in run
subprocess.check_call(args)
File "/usr/lib/python3.5/subprocess.py", line 581, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '('make',)' returned non-zero exit status 2