首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt静态构建在make时失败

PyQt静态构建在make时失败
EN

Stack Overflow用户
提问于 2017-04-30 05:44:42
回答 1查看 944关注 0票数 0

我有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的目录,其中包含Qt5、PyQt5、sip、PyQtChart和Python的g压缩源代码文件夹。

我在VBox中使用的是xubuntu16.04 64位,还有商业PyQt-5.8、商业PyQtChart-5.8、Python-3.6.1、商业Qt-5.8.0和sip-4.19.2。我将Qt许可证信息复制到位于/home/(user)/.qt-license的文件中。我将我的PyQt许可文件复制到了g压缩的PyQt/sip目录中。

当我在终端中运行以下命令时:

代码语言:javascript
复制
python3 build-sysroot.py --build qt python sip pyqt5 pyqtchart --sysroot /home/(user)/(path-to)/sysroot-linux

其中( user )是用户名,( path - to )是系统根目录的路径。

在这个过程进行了大约1.5小时后,我在PyQt构建过程中得到一个错误,内容是

代码语言:javascript
复制
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配置文件启用了SSL。

因此,我尝试在PyQt配置中禁用QtNetwork,在build-sysroot.py中使用"disable=QtNetwork“,在"args”中使用函数"build_pyqt5“(python列表类型;参见第一个链接的第721行),但无济于事-该选项似乎已被忽略,并且无论如何都会尝试构建QtNetwork。

我正在与销售PyQt的公司联系,但我想接触更广泛的编程社区,看看是否有人在过去成功地做到了这一点,也许可以提供一些见解。任何帮助都是非常感谢的。

谢谢你,克里斯

编辑1此处是完整的错误输出,仅修改了目录路径:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-06-21 10:02:41

我将继续分享我的解决方法,以防其他人遇到这个问题。

目前,build-sysroot.py脚本使用pyqtdeploycli生成用于构建PyQt的配置文件,其中包含不能静态构建的Qt模块,如QtWebEngine。无论如何,我最终为PyQt5创建了一个配置文件,并将其放入PyQt5源代码的最上面的g压缩文件夹中:

代码语言:javascript
复制
/home/(user)/(path-to)/sysroot-linux/src/PyQt5_commercial-5.8.2.tar.gz/PyQt5_commercial-5.8.2/pyqt5-linux-64.cfg

PyQt5配置文件(pyqt5-linux-64.cfg):

代码语言:javascript
复制
# The configuration for building PyQt5 for Linux.

# The target Python installation.
py_platform = linux
py_inc_dir = %(sysroot)/include/python%(py_major).%(py_minor)
py_pylib_dir = %(sysroot)/lib
py_pylib_lib = python%(py_major).%(py_minor)m

# The target PyQt installation.
pyqt_module_dir = %(sysroot)/lib/python%(py_major).%(py_minor)/site-packages
pyqt_sip_dir = %(sysroot)/share/sip/PyQt5

# Qt configuration common to all versions.
qt_shared = False

[Qt 5.6]
pyqt_modules = QtCore QtGui QtWidgets

[Qt 5.5]
pyqt_modules = QtCore QtGui QtWidgets

[Qt 5.4]
pyqt_modules = QtCore QtGui QtWidgets

[Qt 5.3]
pyqt_modules = QtCore QtGui QtWidgets

[Qt 5.2]
pyqt_modules = QtCore QtGui QtWidgets

然后我修改了build-sysroot.py build_pyqt5函数,不再调用pyqtdeploycli,而是只使用手动创建的配置文件,如下所示:

代码语言:javascript
复制
def build_pyqt5(host, target, optional, debug):
    """ Build a target static PyQt5. """

    source = host.sysroot.find_source('PyQt5_*', optional=optional)
    if source is None:
        return

    host.sysroot.unpack_source(source)

    license_path = os.path.join(host.sysroot.src_dir, 'pyqt-commercial.sip')
    if os.path.isfile(license_path):
        shutil.copy(license_path, 'sip')

    configuration = 'pyqt5-' + target.name + '.cfg'

    # Disable the call to pyqtdeploycli here
    # host.run(host.pyqtdeploycli, '--package', 'pyqt5', '--output',
    #         configuration, '--target', target.name, 'configure')

    args = [host.interpreter, 'configure.py', '--static', '--qmake',
        host.qmake, '--sysroot', str(host.sysroot), '--no-tools',
        '--no-qsci-api', '--no-designer-plugin', '--no-python-dbus',
        '--no-qml-plugin', '--no-stubs', '--configuration', configuration,
        '--sip', host.sip, '--confirm-license', '-c', '-j2']

    if debug:
        args.append('--debug')

    host.run(*args)

    host.run(host.make)
    host.run(host.make, 'install')

我只让它在QtCore、QtGui和QtWidgets上工作,但是其他的可能是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43700790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档