【问题标题】:How to build Qt 5.2 on Solaris 10?如何在 Solaris 10 上构建 Qt 5.2?
【发布时间】:2014-01-02 09:19:40
【问题描述】:

Qt 页面没有列出为 Solaris 预编译的 Qt 5 软件包。环顾四周,它似乎也不包含在流行的软件包存储库 OpenCSW 中。一些谷歌点击表明,在 Solaris 下构建 Qt 5 需要在 Solaris 10 下进行一些工作。

所以我的问题是:如何在 Solaris 10 下构建 Qt 5.2?

【问题讨论】:

    标签: solaris qt5


    【解决方案1】:

    基本上是这样的:

    cd qt-everywhere-opensource-src-5.2.0
    ./configure -prefix $MY_PREFIX -opensource -confirm-license -nomake tests \
        -R /opt/csw/lib/64 -R /opt/csw/X11/lib/64 -qt-xcb -platform solaris-g++-64 \
        -verbose
    gmake -j16
    gmake -j16 install
    

    加上一些调整,因为 Qt 5 似乎没有用在 Solaris 很多,但是。

    调整

    获取来源

    wget http://download.qt-project.org/official_releases/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz
    md5sum qt-everywhere-opensource-src-5.2.0.tar.gz
    228b6384dfd7272de00fd8b2c144fecd  qt-everywhere-opensource-src-5.2.0.tar.gz
    

    如果系统不支持md5sum,您可以使用openssl md5 filename

    安装依赖项

    我推荐使用OpenCSW,因为我们需要一些依赖来构建Qt。最重要的是:

    CSWlibxcbdevel
    CSWlibicu-dev    # soft-dependency
    CSWgcc4g++
    CSWgmake
    

    我建议使用 GCC 来编译 Qt。我不知道使用 Solaris Studio 的 C++ 编译器有什么好处。相反,该编译器的 C++/STL 支持级别可能不足以满足很多用例。

    设置环境

    确保您的环境干净。这意味着 /opt/csw/bin 先出现,并且没有设置 LD_LIBRAYR_PATH* 变量。

    为了简化事情,从PATH 中删除一些目录可能是个好主意。例如,不会意外拾取来自 Solaris Studio 安装的 ccCC 命令(例如,在编译捆绑的第 3 方组件期间。

    调整规格

    /usr/sfw 下的软件太陈旧了。来自OpenCSW/opt/csw 是更好的替代品。那么X-Open版本对于一些使用过的系统功能是不够的。

    --- a/qtbase/mkspecs/solaris-g++-64/qmake.conf
    +++ b/qtbase/mkspecs/solaris-g++-64/qmake.conf
    @@ -35,7 +35,7 @@ QMAKE_LEX               = flex
     QMAKE_LEXFLAGS          =
     QMAKE_YACC              = yacc
     QMAKE_YACCFLAGS         = -d
    -QMAKE_CFLAGS            = -m64 -D_XOPEN_SOURCE=500 -D__EXTENSIONS__
    +QMAKE_CFLAGS            = -m64 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__
     QMAKE_CFLAGS_DEPS       = -M
     QMAKE_CFLAGS_WARN_ON    = -Wall -W
     QMAKE_CFLAGS_WARN_OFF   = -w
    @@ -58,8 +58,8 @@ QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
     QMAKE_CXXFLAGS_YACC     = $$QMAKE_CFLAGS_YACC
     QMAKE_CXXFLAGS_THREAD   = $$QMAKE_CFLAGS_THREAD
    
    -QMAKE_INCDIR            = /usr/sfw/include
    -QMAKE_LIBDIR            = /usr/sfw/lib/64
    +QMAKE_INCDIR            = /opt/csw/include /opt/csw/X11/include
    +QMAKE_LIBDIR            = /opt/csw/lib/64 /opt/csw/X11/lib/64
     QMAKE_INCDIR_X11        = /usr/openwin/include
     QMAKE_LIBDIR_X11        = /usr/openwin/lib/64
     QMAKE_INCDIR_OPENGL     = /usr/openwin/include
    

    修复外壳

    Solaris 带有一个/bin/sh,它在某种程度上违反了 POSIX Qt 的配置脚本甚至是 qmake 生成的 shell 代码 代码失败。

    POSIX 没有指定/bin/sh 必须符合它只是指定系统必须在“某处”有一个符合标准的外壳。在 Solaris 上,例如在/usr/xpg4/bin/sh 下。获得符合要求的 shell 的可移植方法是在 getconf CS_PATH 返回的目录中搜索它...

    无论如何,我对 Solaris 的选择是只使用/usr/bin/bash

    无论如何,我对 Solaris 的选择是只使用/usr/bin/bash

    --- a/configure
    +++ b/configure
    @@ -1,4 +1,4 @@
    -#! /bin/sh
    +#!/usr/bin/bash
     #############################################################################
     ##
     ## Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
    --- a/qtbase/configure
    +++ b/qtbase/configure
    @@ -1,4 +1,4 @@
    -#!/bin/sh
    +#!/usr/bin/bash
     #############################################################################
     ##
     ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
    @@ -6892,7 +6892,7 @@ fi'`
         echo "$CONFIG_STATUS" | grep '\-confirm\-license' >/dev/null 2>&1 || CONFIG_STATUS="$CONFIG_STATUS -confirm-license"
    
         [ -f "$outpath/config.status" ] && rm -f "$outpath/config.status"
    -    echo "#!/bin/sh" > "$outpath/config.status"
    +    echo "#!/usr/bin/bash" > "$outpath/config.status"
         [ -n "$PKG_CONFIG_SYSROOT_DIR" ] && \
             echo "export PKG_CONFIG_SYSROOT_DIR=$PKG_CONFIG_SYSROOT_DIR" >> "$outpath/config.status"
         [ -n "$PKG_CONFIG_LIBDIR" ] && \
    --- a/qtbase/qmake/generators/makefile.cpp
    +++ b/qtbase/qmake/generators/makefile.cpp
    @@ -2306,6 +2306,10 @@ MakefileGenerator::writeHeader(QTextStream &t)
         if (ofile.lastIndexOf(Option::dir_sep) != -1)
             ofile.remove(0, ofile.lastIndexOf(Option::dir_sep) +1);
         t << "MAKEFILE      = " << ofile << endl << endl;
    +
    +    t << "# custom mod because Solaris /bin/sh is such a standard-violating choice\n"
    +      << "#   - gs, 2013-12-23" << endl;
    +    t << "SHELL         = /usr/bin/bash" << endl << endl;
     }
    
     QList<MakefileGenerator::SubTarget*>
    

    修复 ICU 测试

    Solaris 10 带有一个过时的 libicu - 它缺少 Qt 5 所需的功能。因此,我们只是扩展了 icu-test。然后,如果我们安装最近的 libicu,则要么不构建 ICU 支持,要么构建适当的支持,例如通过 OpenCSW。

    --- a/qtbase/config.tests/unix/icu/icu.cpp
    +++ b/qtbase/config.tests/unix/icu/icu.cpp
    @@ -43,6 +43,16 @@
     #include <unicode/ucol.h>
     #include <unicode/ustring.h>
    
    +// for testing if ucal_clone is there (i.e. if we have libicu >= 4.0)
    +#include <unicode/ucal.h>
    +
    +static UCalendar *ucp(UCalendar *i)
    +{
    +    UErrorCode status = U_ZERO_ERROR;
    +    UCalendar *r = ucal_clone(i, &status);
    +    return r;
    +}
    +
     int main(int, char **)
     {
         UErrorCode status = U_ZERO_ERROR;
    @@ -50,5 +60,10 @@ int main(int, char **)
         if (U_FAILURE(status))
             return 0;
         ucol_close(collator);
    +
    +    UCalendar *cal = ucal_open(0, -1, "C", UCAL_GREGORIAN, &status);
    +    UCalendar *x = ucp(cal);
    +    ucal_close(x);
    +
         return 0;
     }
    

    修复捆绑的 pcre

    也许可以通过 OpenCSW 安装 libpcre。

    --- a/qtbase/src/3rdparty/pcre/pcre_compile.c
    +++ b/qtbase/src/3rdparty/pcre/pcre_compile.c
    @@ -66,6 +66,8 @@ COMPILE_PCREx macro will already be appropriately set. */
     #endif
    
    
    +#include <stdint.h>
    +
     /* Macro for setting individual bits in class bitmaps. */
    
     #define SETBIT(a,b) a[(b)/8] |= (1 << ((b)&7))
    

    修复sha3

    至少在 Solaris 10/Sparc 上,函数 fromBytesToWordfromWordtoBytes 被代码使用,因此:

    --- a/qtbase/src/3rdparty/sha3/KeccakF-1600-opt64.c
    +++ b/qtbase/src/3rdparty/sha3/KeccakF-1600-opt64.c
    @@ -324,7 +324,7 @@ static void KeccakPermutation(unsigned char *state)
         KeccakPermutationOnWords((UINT64*)state);
     }
    
    -#if 0 // Unused in the Qt configuration
    +#if 1 // Unused in the Qt configuration
     static void fromBytesToWord(UINT64 *word, const UINT8 *bytes)
     {
         unsigned int i;
    @@ -445,7 +445,7 @@ static void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsign
     #endif
     }
    
    -#if 0 // Unused in the Qt configuration
    +#if 1 // Unused in the Qt configuration
     static void fromWordToBytes(UINT8 *bytes, const UINT64 word)
     {
         unsigned int i;
    

    包括/类型/使用修复

    uname() 函数是通过 Solaris 上的 CPP 构造激活的 并在该标头中声明:

    --- a/qtbase/src/corelib/io/qfileselector.cpp
    +++ b/qtbase/src/corelib/io/qfileselector.cpp
    @@ -51,6 +51,8 @@
     #include <QtCore/QLocale>
     #include <QtCore/QDebug>
    
    +#include <sys/utsname.h>
    +
     QT_BEGIN_NAMESPACE
    
     //Environment variable to allow tooling full control of file selectors
    

    在 Solaris 下,父级在该代码路径中未使用,代码使用 -Werror 编译...

    --- a/qtbase/src/corelib/io/qfilesystemwatcher.cpp
    +++ b/qtbase/src/corelib/io/qfilesystemwatcher.cpp
    @@ -77,6 +77,7 @@ QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject
     #elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC)
         return QKqueueFileSystemWatcherEngine::create(parent);
     #else
    +    (void)parent;
         return 0;
     #endif
     }
    

    在 Solaris 下 uid_t 有一个“意外”符号 (-> Werror)。将其转换为 ssize_t 应该是一种便携且安全的选择:

    --- a/qtbase/src/corelib/io/qstandardpaths_unix.cpp
    +++ b/qtbase/src/corelib/io/qstandardpaths_unix.cpp
    @@ -132,7 +132,7 @@ QString QStandardPaths::writableLocation(StandardLocation type)
             }
             // "The directory MUST be owned by the user"
             QFileInfo fileInfo(xdgRuntimeDir);
    -        if (fileInfo.ownerId() != myUid) {
    +        if (fileInfo.ownerId() != ssize_t(myUid)) {
                 qWarning("QStandardPaths: wrong ownership on runtime directory %s, %d instead of %d", qPrintable(xdgRuntimeDir),
                          fileInfo.ownerId(), myUid);
                 return QString();
    

    线程代码的类似问题(由于指针转换中的符号不​​匹配而导致错误)。转换为 size_t 应该是一个可移植的安全选择:

    --- a/qtbase/src/corelib/thread/qthread_unix.cpp
    +++ b/qtbase/src/corelib/thread/qthread_unix.cpp
    @@ -231,7 +231,7 @@ QThreadData *QThreadData::current()
             }
             data->deref();
             data->isAdopted = true;
    -        data->threadId = (Qt::HANDLE)pthread_self();
    +        data->threadId = (Qt::HANDLE)((size_t)pthread_self());
             if (!QCoreApplicationPrivate::theMainThread)
                 QCoreApplicationPrivate::theMainThread = data->thread;
         }
    @@ -314,7 +314,7 @@ void *QThreadPrivate::start(void *arg)
                 thr->d_func()->setPriority(QThread::Priority(thr->d_func()->priority & ~ThreadPriorityResetFlag));
             }
    
    -        data->threadId = (Qt::HANDLE)pthread_self();
    +        data->threadId = (Qt::HANDLE)((size_t)pthread_self());
             set_thread_data(data);
    
             data->ref();
    @@ -393,7 +393,7 @@ void QThreadPrivate::finish(void *arg)
     Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
     {
         // requires a C cast here otherwise we run into trouble on AIX
    -    return (Qt::HANDLE)pthread_self();
    +    return (Qt::HANDLE)((size_t)pthread_self());
     }
    
     #if defined(QT_LINUXBASE) && !defined(_SC_NPROCESSORS_ONLN)
    

    结构 in_addr 在 Solaris 上有一个结构作为第一个属性,因此在使用 {0} 初始化时会向 GCC 发出警告 - 因此,在 Qt 编译期间会产生错误:

    --- a/qtbase/src/network/socket/qnativesocketengine_unix.cpp
    +++ b/qtbase/src/network/socket/qnativesocketengine_unix.cpp
    @@ -63,6 +63,7 @@
     #endif
    
     #include <netinet/tcp.h>
    +#include <string.h>
    
     QT_BEGIN_NAMESPACE
    
    @@ -737,7 +738,8 @@ QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
             return QNetworkInterface::interfaceFromIndex(v);
         }
    
    -    struct in_addr v = { 0 };
    +    struct in_addr v;
    +    memset(&v, 0, sizeof(struct in_addr));
         QT_SOCKOPTLEN_T sizeofv = sizeof(v);
         if (::getsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &v, &sizeofv) == -1)
             return QNetworkInterface();
    

    X11/Xutil.h 的标头注释将 X11/Xutil.h 列为依赖项,实际上,如果不包含,则在 Solaris 下缺少一些声明。

    --- a/qtbase/src/plugins/platforms/xcb/qxcbmime.cpp
    +++ b/qtbase/src/plugins/platforms/xcb/qxcbmime.cpp
    @@ -46,6 +46,7 @@
     #include <QtCore/QBuffer>
     #include <qdebug.h>
    
    +#include <X11/Xlib.h>
     #include <X11/Xutil.h>
    
     #undef XCB_ATOM_STRING
    

    X11/extensions/XIproto.h 在 Solaris 下不是 C++ 安全的。这意味着它包含结构成员名称class。幸运的是,该代码中似乎没有使用标头。

    --- a/qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp
    +++ b/qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp
    @@ -43,7 +43,7 @@
    
     #include <QtCore/QByteArray>
    
    -#include <X11/extensions/XIproto.h>
    +//#include <X11/extensions/XIproto.h>
    
     QT_BEGIN_NAMESPACE
     /* Implementation of http://standards.freedesktop.org/xsettings-spec/xsettings-0.5.html */
    

    pow() 函数有一些 C++ 标准中指定的重载,这在 Solaris 下引入了歧义。像这样修复类型应该是可移植且安全的:

    --- a/qtdeclarative/src/qml/jsruntime/qv4globalobject.cpp
    +++ b/qtdeclarative/src/qml/jsruntime/qv4globalobject.cpp
    @@ -534,7 +534,7 @@ ReturnedValue GlobalFunctions::method_parseInt(CallContext *ctx)
         }
    
         if (overflow) {
    -        double result = (double) v_overflow * pow(R, overflow_digit_count);
    +        double result = (double) v_overflow * pow(double(R), int(overflow_digit_count));
             result += v;
             return Encode(sign * result);
         } else {
    

    在 Solaris 下,alloca 需要另一个头文件:

    --- a/qtdeclarative/src/qml/jsruntime/qv4stringobject.cpp
    +++ b/qtdeclarative/src/qml/jsruntime/qv4stringobject.cpp
    @@ -73,6 +73,11 @@
     #  include <windows.h>
     #endif
    
    +
    +#if OS(SOLARIS)
    +#include <alloca.h>
    +#endif
    +
     using namespace QV4;
    
     DEFINE_MANAGED_VTABLE(StringObject);
    

    修复深层 mkdir

    Qt 做了一个“深度”mkdir()(例如 mkdir -p 之类的东西,用于创建目录层次结构,例如 ~/.config/company/product。如果现有目录位于非- 可写 NFS 挂载父级 - 因为在这种情况下 Solaris 返回 EACCESS 而不是 EEXIST

    --- a/qtbase/src/corelib/io/qfilesystemengine_unix.cpp
    +++ b/qtbase/src/corelib/io/qfilesystemengine_unix.cpp
    @@ -579,6 +579,11 @@ bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool crea
                             // on the QNet mountpoint returns successfully and reports S_IFDIR.
                             || errno == ENOENT
     #endif
    +#if defined(Q_OS_SOLARIS)
    +                        // On Solaris 10, mkdir returns EACCESS on a directory which exists
    +                        // inside an NFS mount ...
    +                        || errno == EACCES
    +#endif
                         ) {
                             QT_STATBUF st;
                             if (QT_STAT(chunk.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR)
    

    临时文件

    Solaris 也没有mkdtemp():

    --- a/qtbase/src/corelib/io/qtemporarydir.cpp
    +++ b/qtbase/src/corelib/io/qtemporarydir.cpp
    @@ -52,7 +52,7 @@
     #endif
    
     #include <stdlib.h> // mkdtemp
    -#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
    +#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_SOLARIS)
     #include <private/qfilesystemengine_p.h>
     #endif
    
    @@ -96,7 +96,7 @@ static QString defaultTemplateName()
    
     static char *q_mkdtemp(char *templateName)
     {
    -#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
    +#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_SOLARIS)
         static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    
         const size_t length = strlen(templateName);
    

    线程

    Solaris 没有pthread_get_stacksize_np_np 后缀代表不可移植)。

    Solaris 有另一个函数用于获取堆栈地址/大小值。我的尝试:

    --- a/qtdeclarative/src/qml/jsruntime/qv4engine.cpp
    +++ b/qtdeclarative/src/qml/jsruntime/qv4engine.cpp
    @@ -73,6 +73,11 @@
     #include "qv4isel_moth_p.h"
    
     #if USE(PTHREADS)
    +
    +#if OS(SOLARIS)
    +#include <thread.h>
    +#endif
    +
     #  include <pthread.h>
     #endif
    
    @@ -103,6 +108,11 @@ quintptr getStackLimit()
         } else
             size = pthread_get_stacksize_np(thread_self);
         stackLimit -= size;
    +#  elif OS(SOLARIS)
    +    stack_t ss;
    +    int r = thr_stksegment(&ss);
    +    (void)r;
    +    stackLimit = reinterpret_cast<quintptr>(ss.ss_sp);
     #  else
         void* stackBottom = 0;
         pthread_attr_t attr;
    
    
    --- a/qtdeclarative/src/qml/jsruntime/qv4mm.cpp
    +++ b/qtdeclarative/src/qml/jsruntime/qv4mm.cpp
    @@ -67,6 +67,11 @@
     #include <sys/storage.h>   // __tls()
     #endif
    
    +#if OS(SOLARIS)
    +#include <thread.h>
    +#include <pthread.h>
    +#endif
    +
     QT_BEGIN_NAMESPACE
    
     using namespace QV4;
    @@ -218,6 +223,11 @@ MemoryManager::MemoryManager()
     #  if OS(DARWIN)
         void *st = pthread_get_stackaddr_np(pthread_self());
         m_d->stackTop = static_cast<quintptr *>(st);
    +#  elif OS(SOLARIS)
    +    stack_t ss;
    +    int r = thr_stksegment(&ss);
    +    (void)r;
    +    m_d->stackTop = static_cast<quintptr *>(ss.ss_sp) + ss.ss_size/sizeof(quintptr);
     #  else
         void* stackBottom = 0;
         pthread_attr_t attr;
    

    我建议仔细检查该代码,因为我的 Qt 代码不使用该 Qt 模块,因此我没有对其进行太多测试。

    XKB 扩展

    Qt 5 似乎严重依赖 XKB 扩展。似乎没有 XKB 支持就无法构建 Qt 5。它与 xkbcommon 捆绑在一起。

    首先,确保它找到正确的 XKB 数据库。否则键盘输入在您的 Qt 程序中根本不起作用!

    Solaris 没有默认值/usr/share/X11/xkb。相反,它有:

    /usr/X11/lib/X11/xkb
    /usr/openwin/lib/X11/xkb
    

    但我没有运气 - xkbcommon 根本找不到任何组件。

    我最终将/usr/share/X11/xkb 从 cygwin 发行版复制到自定义路径并将其配置为 XKB 数据库。

    无论您选择何种 XKB,都必须对其进行配置:

    --- a/qtbase/src/3rdparty/xkbcommon.pri
    +++ b/qtbase/src/3rdparty/xkbcommon.pri
    @@ -1,7 +1,12 @@
     QMAKE_CFLAGS += -std=gnu99 -w
     INCLUDEPATH += $$PWD/xkbcommon $$PWD/xkbcommon/src $$PWD/xkbcommon/src/xkbcomp
    
    +solaris-g++-64 {
    +DEFINES += DFLT_XKB_CONFIG_ROOT='\\"/MY/XKB/CHOICE\\"'
    +} else {
     DEFINES += DFLT_XKB_CONFIG_ROOT='\\"/usr/share/X11/xkb\\"'
    +}
    
     ### RMLVO names can be overwritten with environmental variables (See libxkbcommon documentation)
     DEFINES += DEFAULT_XKB_RULES='\\"evdev\\"'
    

    为了测试,检查错误消息参数中的 NULL 值也很有意义:

    --- a/qtbase/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp.c
    +++ b/qtbase/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp.c
    @@ -68,8 +68,11 @@ text_v1_keymap_new_from_names(struct xkb_keymap *keymap,
             log_err(keymap->ctx,
                     "Couldn't look up rules '%s', model '%s', layout '%s', "
                     "variant '%s', options '%s'\n",
    -                rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant,
    -                rmlvo->options);
    +                rmlvo->rules, rmlvo->model,
    +                rmlvo->layout ? rmlvo->layout : "(NULL)",
    +                rmlvo->variant ? rmlvo->variant : "(NULL)",
    +                rmlvo->options ? rmlvo->options : "(NULL)"
    +                );
             return false;
         }
    

    还有可能您的 XServer 甚至不支持 XKB 扩展。同样,我不知道 Qt 5 是否可以在 X 下配置 disabled-XKB-support。

    你可以像这样检查你的 X-server:

    xprop -root | grep xkb
    

    或者调用一个随机的 xkb 程序,例如:

    xkbvleds
    

    这样的调用不应导致如下错误:

    Fatal Error: Server doesn't support a compatible XKB
    

    如果您的 XServer 没有 XKB - Qt 程序可能会出现段错误。 Qt 似乎并没有真正检查 XKB 支持。当 XKB 不可用时,它似乎没有回退机制。

    示例

    一些例子因为模块 quick 没有被找到而失败:

    --- a/qtconnectivity/examples/bluetooth/scanner/scanner.pro
    +++ b/qtconnectivity/examples/bluetooth/scanner/scanner.pro
    @@ -1,4 +1,4 @@
    -QT = core bluetooth quick
    +QT = core bluetooth # quick
     SOURCES += qmlscanner.cpp
    
     TARGET = qml_scanner
    diff --git a/qtconnectivity/examples/nfc/poster/poster.pro b/qtconnectivity/examples/nfc/poster/poster.pro
    index d108b2a..d0d0659 100644
    --- a/qtconnectivity/examples/nfc/poster/poster.pro
    +++ b/qtconnectivity/examples/nfc/poster/poster.pro
    @@ -1,4 +1,4 @@
    -QT += qml quick network nfc widgets
    +QT += qml network nfc widgets # quick
    
     SOURCES += \
         qmlposter.cpp
    

    它们也是在没有的情况下构建的。

    进行安装

    gmake install 令人惊讶地触发了几个尚未编译的模块的编译。因此并行执行它是有意义的:

    $ gmake -j16 install
    

    (假设您的系统有足够数量的核心)

    Qt帮助

    捆绑的 QtHelp 模块未通过主要编译/安装步骤构建/安装。

    解决这个问题:

    cd qttools
    PATH=$MY_PREFIX/bin:$PATH qmake
    gmake
    gmake install
    

    未解决的问题

    • 当使用远程 Cygwin-X 连接时,有些颜色很奇怪 - 例如。标准的小部件灰色是一些浅蓝色 - 有什么想法可以从哪里开始寻找?
    • QtSVG 已成功构建,但显示一个小的 SVG(例如,在 QLabel 内)会挂起对话框 - truss -u : 显示 libm/QtWidget 内的函数调用 - 也许系统太慢和/或某些代码路径未在 Solaris 上优化/结合 X-forwarding over ssh
    • Qt 程序在启动时打印:Qt Warning: Could not find a location of the system's Compose files. Consider setting the QTCOMPOSE environment variable. - 不知道这是关于什么功能

    结论

    通过这些调整“正常”Qt 程序(没有 QtSvg)编译 并在 Solaris 10 下运行良好。

    【讨论】:

    • 将上述修复贡献给 Qt 怎么样?或者至少打开错误报告,这样事情就不会被忽视。请注意,其中一些已经修复或有待修复,f.i. cea101bd 解决了 SHA3 代码构建,this 解决了 QFileSelector 的问题,等等。
    • @peppe,是的,我会在 Qt 的代码审查过程中做一些 rtfm,然后提交缺失的部分。目前有 bugreports.qt-project.org/browse/QTBUG-35905 有一些初步审查 cmets。
    • 许多这些问题在 Solaris 11 中得到了修复,它比 Solaris 10 更新了 7 年。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2021-11-19
    相关资源
    最近更新 更多