2015-08-18 29 views
5

Tôi đang gặp một số sự cố khi xây dựng PyQt5 trên Ubuntu 14.04. Tôi đang làm việc với một số mã có một sự phụ thuộc cứng trên Python 2,7; vì vậy, tôi không thể sử dụng các gói python3 từ kho lưu trữ của Ubuntu. Các tìm kiếm thêm về các gói của Ubuntu cho thấy rằng có các gói dev và doc cho Python 2 pyqt5. Nhưng, không có gì để cài đặt các thư viện cần thiết để viết mã.Sự cố khi xây dựng PyQt5 trên Ubuntu 14.04

Điều này đã dẫn tôi tạo một bản dựng tùy chỉnh cho PyQt5. Tôi nhận được mã nguồn cho phiên bản 5.5 từ đây: https://www.riverbankcomputing.com/software/pyqt/download5 và tôi đang sử dụng ngụm như được cung cấp bởi repos Ubuntu (cài đặt của kubuntu-máy tính để bàn đòi hỏi ngụm).

Tôi đọc mà nó dễ dàng để có các phiên bản không phù hợp của ngụm vì vậy tôi đã làm việc kiểm tra sau:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sip 
>>> print(sip, sip.SIP_VERSION_STR) 
(<module 'sip' from '/usr/lib/python2.7/dist-packages/sip.so'>, '4.16.9') 

Và:

$ sip -V 
4.16.9 

Ngoài ra tôi đang sử dụng các công cụ Qt5 cung cấp bởi Repos Ubuntu . Điều này bao gồm việc cài đặt qtdeclarative5- * (có thể là quá mức cần thiết) và qt5-default. Dưới đây là một số thông tin về qmake:

qmake --version 
QMake version 3.0 
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu 

Tôi hiện đã cài đặt PyQt4 và đọc trên quá trình cài đặt lưu ý rằng đây sẽ là tốt miễn là họ được cả biên dịch chống lại cùng một phiên bản của ngụm.

Sau khi tải về, tôi mở gói tarball và cố gắng một xây dựng như sau:

đầu ra
sudo ln -s /usr/include/python2.7 /usr/local/include/python2.7 
python configure.py --sip-incdir=/usr/include/python2.7/ 
make 

Cấu hình xuất hiện để xác định đúng phiên bản của ngụm và tôi nhận được như sau (dường như) ngụm liên quan biên dịch lỗi từ làm :

make[1]: Entering directory `~/Downloads/PyQt-gpl-5.5/QtWebKit' 
g++ -c -m64 -pipe -fno-exceptions -O2 -Wall -W -D_REENTRANT -fPIC -DSIP_PROTECTED_IS_PUBLIC -Dprotected=public -DQT_NO_DEBUG -DQT_PLUGIN -DQT_WEBKIT_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -I/usr/include/python2.7 -I/usr/include/qt5 -I/usr/include/qt5/QtWebKit -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o sipQtWebKitQWebSecurityOrigin.o sipQtWebKitQWebSecurityOrigin.cpp 
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function ‘PyObject* meth_QWebSecurityOrigin_addAccessWhitelistEntry(PyObject*, PyObject*)’: 
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:384:9: error: ‘SubdomainSetting’ is not a member of ‘QWebSecurityOrigin’ 
     QWebSecurityOrigin::SubdomainSetting a2; 
     ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:384:46: error: expected ‘;’ before ‘a2’ 
     QWebSecurityOrigin::SubdomainSetting a2; 
              ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:387:214: error: ‘a2’ was not declared in this scope 
     if (sipParseArgs(&sipParseErr, sipArgs, "BJ1J1E", &sipSelf, sipType_QWebSecurityOrigin, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QWebSecurityOrigin_SubdomainSetting, &a2)) 
                                                        ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:389:21: error: ‘class QWebSecurityOrigin’ has no member named ‘addAccessWhitelistEntry’ 
      sipCpp->addAccessWhitelistEntry(*a0,*a1,a2); 
        ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function ‘PyObject* meth_QWebSecurityOrigin_removeAccessWhitelistEntry(PyObject*, PyObject*)’: 
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:417:9: error: ‘SubdomainSetting’ is not a member of ‘QWebSecurityOrigin’ 
     QWebSecurityOrigin::SubdomainSetting a2; 
     ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:417:46: error: expected ‘;’ before ‘a2’ 
     QWebSecurityOrigin::SubdomainSetting a2; 
              ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:420:214: error: ‘a2’ was not declared in this scope 
     if (sipParseArgs(&sipParseErr, sipArgs, "BJ1J1E", &sipSelf, sipType_QWebSecurityOrigin, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QWebSecurityOrigin_SubdomainSetting, &a2)) 
                                                        ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:422:21: error: ‘class QWebSecurityOrigin’ has no member named ‘removeAccessWhitelistEntry’ 
      sipCpp->removeAccessWhitelistEntry(*a0,*a1,a2); 
        ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function ‘void* init_type_QWebSecurityOrigin(sipSimpleWrapper*, PyObject*, PyObject*, PyObject**, PyObject**, PyObject**)’: 
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:477:48: error: no matching function for call to ‘QWebSecurityOrigin::QWebSecurityOrigin(const QUrl&)’ 
      sipCpp = new QWebSecurityOrigin(*a0); 
               ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:477:48: note: candidates are: 
In file included from ~/Downloads/PyQt-gpl-5.5/sip/QtWebKit/qwebsecurityorigin.sip:26:0: 
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:64:5: note: QWebSecurityOrigin::QWebSecurityOrigin(QWebSecurityOriginPrivate*) 
    QWebSecurityOrigin(QWebSecurityOriginPrivate* priv); 
    ^
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:64:5: note: no known conversion for argument 1 from ‘const QUrl’ to ‘QWebSecurityOriginPrivate*’ 
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:58:5: note: QWebSecurityOrigin::QWebSecurityOrigin(const QWebSecurityOrigin&) 
    QWebSecurityOrigin(const QWebSecurityOrigin& other); 
    ^
/usr/include/qt5/QtWebKit/qwebsecurityorigin.h:58:5: note: no known conversion for argument 1 from ‘const QUrl’ to ‘const QWebSecurityOrigin&’ 
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: At global scope: 
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:516:48: error: ‘AllowSubdomains’ is not a member of ‘QWebSecurityOrigin’ 
    {sipName_AllowSubdomains, static_cast<int>(QWebSecurityOrigin::AllowSubdomains), 21}, 
               ^
~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:517:51: error: ‘DisallowSubdomains’ is not a member of ‘QWebSecurityOrigin’ 
    {sipName_DisallowSubdomains, static_cast<int>(QWebSecurityOrigin::DisallowSubdomains), 21}, 
               ^
make[1]: *** [sipQtWebKitQWebSecurityOrigin.o] Error 1 
make[1]: Leaving directory `~/Downloads/PyQt-gpl-5.5/QtWebKit' 
make: *** [sub-QtWebKit-make_first-ordered] Error 2 

Kết quả là tôi có thể cài đặt và nhận một số chức năng mà tôi mong đợi; tuy nhiên, tôi thiếu một số chức năng được yêu cầu với các tiện ích WebKit. Tôi hy vọng rằng tôi đã cung cấp đủ thông tin để mô tả nơi tôi đang bị mắc kẹt. Tôi cảm thấy chỉ nhút nhát đào sâu vào mã; tuy nhiên, tôi cho rằng câu trả lời thực sự đơn giản hơn rất nhiều.

Cảm ơn trước!

+0

Bạn đã cài đặt gói dev cho libqt5webkit chưa? (PS: ubuntu-14.10 có pyqt5 gói cho python2). – ekhumoro

+0

Tôi đã cài đặt libqt5webkit từ quản lý gói. Tôi cũng thấy một số điều từ tìm kiếm của tôi: 1.) Nó sẽ xuất hiện từ một chuỗi email mà tôi đã thấy (https://riverbankcomputing.com/pipermail/pyqt/2014-May/034175.html) rằng các gói Python 2 cho PyQt5 là cố ý thiếu 2.) có vẻ là vấn đề phiên bản với Qt5 trong repo Ubuntu. – Joseph

+0

Tôi đã nói với bạn rằng các gói bây giờ đã có trong ubuntu-14.10. Nếu bạn gặp khó khăn trong việc chấp nhận lời khuyên, hãy tự xem [http://packages.ubuntu.com/search?keywords=python-pyqt5&searchon=names&suite=utopic§ion=all). Và như tôi đã nói, bạn cần gói ** dev ** cho qt webkit, không chỉ là libs. – ekhumoro

Trả lời

7

Vì vậy,

Tôi bắt đầu đào qua gói nguồn cho tệp không được biên dịch. Trong thư mục ngụm có một QWebSecurityOrigin tập tin ngụm chứa sau:

%If (Qt_5_2_0 -) 

    enum SubdomainSetting 
    { 
     AllowSubdomains, 
     DisallowSubdomains, 
    }; 

%End 

tôi một cách hợp lý có thể mong đợi rằng mã này được đưa vào như qmake nói với tôi như sau:

qmake --version 
QMake version 3.0 
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu 

Tiếp theo, tôi muốn tìm kiếm vào qwebsecurityorigin.h đã được cung cấp bởi Qt để xem lỗi có thể đến từ đó không. Mỏ được cài đặt ở đây: /usr/include/qt5/QtWebKit/qwebsecurityorigin.h

#ifndef _WEBSECURITYORIGIN_H_ 
#define _WEBSECURITYORIGIN_H_ 

#include <QtCore/qurl.h> 
#include <QtCore/qshareddata.h> 

#include "qwebkitglobal.h" 

namespace WebCore { 
    class SecurityOrigin; 
    class ChromeClientQt; 
} 

class QWebSecurityOriginPrivate; 
class QWebDatabase; 
class QWebFrame; 

class QWEBKIT_EXPORT QWebSecurityOrigin { 
public: 
    static QList<QWebSecurityOrigin> allOrigins(); 
    static void addLocalScheme(const QString& scheme); 
    static void removeLocalScheme(const QString& scheme); 
    static QStringList localSchemes(); 

    ~QWebSecurityOrigin(); 

    QString scheme() const; 
    QString host() const; 
    int port() const; 

    qint64 databaseUsage() const; 
    qint64 databaseQuota() const; 

    void setDatabaseQuota(qint64 quota); 
    void setApplicationCacheQuota(qint64 quota); 

    QList<QWebDatabase> databases() const; 

    QWebSecurityOrigin(const QWebSecurityOrigin& other); 
    QWebSecurityOrigin &operator=(const QWebSecurityOrigin& other); 
private: 
    friend class QWebDatabase; 
    friend class QWebFrameAdapter; 
    friend class WebCore::ChromeClientQt; 
    QWebSecurityOrigin(QWebSecurityOriginPrivate* priv); 

private: 
    QExplicitlySharedDataPointer<QWebSecurityOriginPrivate> d; 
}; 

Lưu ý, không xác định enum. Tìm kiếm Qt 5.5 gợi ý rằng enum nên ở đó: http://doc.qt.io/qt-5/qwebsecurityorigin.html#SubdomainSetting-enum

Cuối cùng, đã nhớ lại rằng tôi đã cài đặt libqt5webkit riêng biệt với phần lớn thư viện Qt; vì vậy, tôi đã kiểm tra phiên bản trên bao bì:

dpkg -s libqt5webkit5 
Package: libqt5webkit5 
Status: install ok installed 
Priority: optional 
Section: libs 
Installed-Size: 34225 
Maintainer: Ubuntu Developers <[email protected]> 
Architecture: amd64 
Multi-Arch: same 
Source: qtwebkit-opensource-src 
Version: 5.1.1-1ubuntu8 

Kết quả này gần giống với gói dev. Vì vậy, điều này làm cho nó xuất hiện như phần lớn của phân phối Qt5, trong repos, là trên một phiên bản khác với webkit. Hơn nữa, nếu QWebKit là trên 5.1.1, nó sẽ giải thích lý do tại sao enum là mất tích như các tập tin sip dường như đề nghị nó là một bổ sung trong 5.2.0.

Vì vậy, giải pháp của tôi là tải xuống và cài đặt Qt 5.5 từ trang web Qt bằng trình cài đặt tự động (chạy với sudo, sử dụng mặc định). Sau đó tôi bắt đầu mới với nguồn PyQt5 bằng cách thổi thư mục xây dựng và giải nén lại nguồn:

python configure.py --sip-incdir=/usr/include/python2.7/ --qmake=/opt/Qt/5.5/gcc_64/bin/qmake 
make 
sudo make install 

Giấy phép không tương thích; tuy nhiên, tìm kiếm nhanh thông qua kịch bản lệnh pyqt5 configure.py, bằng cách sử dụng đầu ra lỗi, có thể cung cấp một số thông tin chi tiết về việc cấu hình và biên dịch mã.

Các vấn đề liên quan