如何在 Solaris 10 上构建 Qt 5.2?

2023-11-22

Qt 页面未列出适用于 Solaris 的预编译 Qt 5 软件包。搜索了一下,它似乎也没有包含在流行的软件包存储库 OpenCSW 中。一些谷歌点击表明在 Solaris 下构建 Qt 5 涉及 Solaris 10 下的一些工作。

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


基本上是:

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_LIBRARY_PATH* 变量。

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

调整规格

该软件下/usr/sfw实在是太过时了。/opt/csw from OpenCSW是一个更好的替代品。那么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。然后,要么没有构建 ICU 支持,要么构建适当的 ICU 支持,以防万一我们安装了最新的 libicu,例如通过 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;
 }

修复捆绑 PCR

也许人们可以通过 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))

Fix sha3

至少在 Solaris 10/Sparc 上有这些功能fromBytesToWord and fromWordtoBytes被代码使用,因此:

--- 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;

包括/类型/用法修复

The 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 上有一个结构作为第一个属性,因此在初始化时会发出 GCC 警告{0}- 因此,在 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 lists 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

The 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 */

The 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 安装父目录中,则 Qt 5.2 算法可能会在 Solaris 上过早中止 - 因为在这种情况下 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);

Pthreads

索拉里斯没有pthread_get_stacksize_np (the _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 下配置禁用-XKB-支持。

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

xprop -root | grep xkb

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

xkbvleds

此类调用不应导致如下错误:

Fatal Error: Server doesn't support a compatible XKB

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

Examples

一些示例由于找不到模块快速而失败:

--- 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

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

进行安装

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

$ gmake -j16 install

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

QtHelp

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

要解决这个问题:

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

开放式问题

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

结论

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Solaris 10 上构建 Qt 5.2? 的相关文章

  • 本机 KDE 查找 Qt 5 应用程序

    我在 Kubuntu 12 10 Linux 机器上安装了 Qt5 和 Qt4 并注意到以下内容 使用 Qt4 编译的程序具有原生 KDE 外观和感觉 我使用默认的 KDEOxygen主题 我的程序也是如此 注意带有标题的平滑渐变和聚焦小部
  • 设置Loader项目属性

    In the context https stackoverflow com questions 33513546 delegate folderlistmodel in tableview文件管理器 我有一个TableView组件保存在文
  • 查找 QWidget 所在的屏幕

    具有功能 QApplication desktop gt screenCount QApplication desktop gt screenGeometry 我发现我的系统上存在多少屏幕以及它们位于哪个屏幕坐标上 现在我想找出 QWidg
  • 按索引列出的 QML 模型数据

    我有基于 QAbstractListModel 的模型 class RecordModel public QAbstractListModel QQmlContext ctxt engine rootContext ctxt gt setC
  • 我的 Qt5 可执行文件无法在 Visual Studio 2010 之外运行

    我用 Qt5 和 Visual Studio 2010 完成了一个大项目 使用运行按钮 一切都在 Visual Studio 内部 但我的目标当然是在没有视觉工作室的情况下将其发布给其他人 我的问题是 我无法在 Visual Studio
  • 错误“标记不是预处理器子表达式中的有效二元运算符”

    如果我构建并运行一个项目 基本上是由 Mac OS 10 6 上的 Qt 框架生成的存根 我会得到以下错误输出 Users home Qt5 0 1 5 0 1 clang 64 include QtCore qisenum h 53 Er
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • 无法隐藏 QMenu 对象 QMenu::setVisible()?

    我已经建立了一个QMenu MainMenu在我的上面MainWindow在我的应用程序中 大家都习惯了 我有以下QMenu主菜单 文件 编辑 SuperHeavyExpertMenus 设置 帮助 我想隐藏子树SuperHeaverExp
  • x86 上 SPARC 的交叉编译

    我已经看到关于交叉编译器的回复如何在 Windows 上交叉编译 C 代码 以便二进制文件也可以在 Unix Solaris HPUX Linux 上运行 https stackoverflow com questions 579695 h
  • 使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本

    几天来我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本 我就是不明白我做错了什么 System Windows 7 64 位 Visual Studio 2013 仍安装 Visual Studio 2012
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • bash 行长度限制从何而来?

    在运行 Bash 4 4 19 标准安装 的 Solaris 11 上 输入行似乎有 256 个字符的限制 我想了解这个限制从何而来 我浏览了手册页 但没有找到任何解决此问题的内容 仅当未使用 readline 库时才会发生这种情况 在下面
  • Pyqt5 中的 QThreads:这是官方 QThread 文档的正确 C++ 到 Python 翻译吗?

    关于如何实例化和使用的官方文档QThread可以在这里找到 http doc qt io qt 5 qthread html http doc qt io qt 5 qthread html 该文档描述了两种基本方法 1 工作对象方法和 2
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 内容居中的流式布局

    我有一排项目 当窗口宽度变得太小而无法显示一行中的所有项目时 这些项目应该堆叠起来 如下图所示 The Flow组件堆叠项目 但它们不是居中而是在左侧或右侧对齐 Flow Item Item Item Item Item QML 中是否有内
  • Qt 5 和 QProcess 使用信号/槽 read 重定向标准输出

    这个问题困扰着我 因为它应该有效 但遗憾的是它没有 我试图实现的是读取某个进程的标准输出并让另一个进程处理它 即打印出来 产生输出的过程如下所示 include
  • 使用 QPrinter 打印第 x 页(共 y 页)

    我使用 qt 从 html 代码生成 pdf 文件 QTextDocument document new QTextDocument document gt setHtml htmlContent QPrinter printer QPri
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • QTextEdit 与 QPlainTextEdit

    有什么区别QTextEdit and QPlainTextEdit 为什么要使用其中一种而不是另一种 我正在编写一个文本编辑器作为学习 Qt5 的练习 现在我想知道是否使用QTextEdit or QPlainTextEdit 到目前为止我
  • 是否可以在屏幕外渲染 QWebEnginePage/QWebEngineView?

    我已经部分工作 但我面临几个困难 1 看来QWebEnginePage需要QWebEngineView 请参阅此处的 setView 方法 https code woboq org qt5 qtwebengine src webengine

随机推荐

  • DataGridViewColumn.DataPropertyName 属性

    我有一个 DataGridView 控件 我想用数据填充它 我使用 DataSource 属性 dgvDealAsset is DataGridView private void DealAssetListControl Load obje
  • stp aarch64 指令必须与“非连续寄存器对”一起使用

    aarch64 架构没有多重存储和加载指令 即没有与 armv7 arch 中的 stm 和 ldm 等效的指令 相反 您必须使用 stp 和 ldp 指令来存储和加载寄存器对 根据ARM参考手册 http www element14 co
  • 在unix中使用.sh文件运行.jar文件

    我有一个 jar 文件DirectoryScanner jar在Windows 7中创建 我想在unix服务器上执行这个jar 我在 putty 中运行了以下命令 jar 按预期运行得非常好 java jar DirectoryScanne
  • 从一个容器到另一个容器运行命令

    我有两个 dockerized 项目 一个使用 NodeJS 另一个使用 Python 我想从 NodeJS 应用程序触发 Python 脚本执行 在带有 Python 应用程序的容器上 基本上 NodeJS 应用程序会运行类似的东西exe
  • 为什么 iostream 包含 time.h?

    考虑这段代码 include
  • jQuery - 使用变量作为函数名称

    在 Jquery 中 我想通过更改变量名称来禁用我想要的任何插件 但是下面的代码不起作用 function disablePlugin functionName divID functionName disable disablePlugi
  • 在@implementation中添加ivars

    对于良好的封装 体面Objective C程序员把他们的private伊瓦尔 在 私人extension在主实现文件中声明 如下所示 MyClass m interface MyClass float value end implement
  • 如何在运行时检查 Mac OS X 版本

    我正在使用下面的代码在运行时检查 OS X 版本 if floor NSAppKitVersionNumber lt NSAppKitVersionNumber10 10 On a 10 10 x or earlier system 但这个
  • tilelayer 上的 noWrap 选项仅部分起作用

    为了防止我使用的最高缩放级别出现多个重复的世界地图noWrap true选项 它运行良好 但仅在地图的左侧 灰色区域 右侧仍然显示额外的图块 这是为什么 UPDATE1 看起来这是特定 Mapbox 图块或其加载方式的问题 这里没有包裹和h
  • d3.js 在悬停时传递多个函数

    我使用了一个教程来在鼠标悬停时获得此功能 function arcTween outerRadius delay return function d3 select this transition delay delay attrTween
  • NHibernate 一对一映射,其中第二个表数据可以为空

    我有一个现有数据库 其中包含事务表 我添加了一个名为 TransactionSequence 的新表 其中每个事务最终只有一条记录 我们使用序列表来计算给定帐户的交易 我已将其映射为一对一映射 其中 TransactionSequence
  • 如何通过 Angular 方式示例在 Angular DataTables 中使用服务器端选项?

    我正在尝试使用角度数据表与服务器端处理选项 但是当我尝试在他们的 角度方式示例 仅呈现第一个请求 发送后续请求 分页 排序 搜索 但它们从不更新表 经过一番挖掘 我发现了一个不相关的用户贡献的注释这表明您覆盖ajax选项与您自己的函数来处理
  • 启用 Code First 实体框架 VS Web Express 2012

    我正在尝试在 Visual Studio Web Express 2012 中启用 Code First 根据我目前所读到的内容 我必须使用包管理器控制台和命令 Enable Migrations 当我这样做时 我收到以下错误 Except
  • Google 地点自动完成功能从结果中删除州和国家/地区

    https google developers appspot com maps documentation javascript examples places autocomplete 我有一个类似于上面的谷歌位置自动完成演示网址的页面
  • 经典 ASP:捕获错误

    是否有可能在全局级别捕获经典 ASP 中的所有 500 个错误 也许是 IIS 中的东西 我现在用的是II6 我喜欢捕获错误消息 然后将其存储在数据库中 我知道它在 ASPX 页面中是可能的 但不确切知道你在经典的 asp 中是如何做的 谢
  • 在附加元素上触发 CSS 转换

    As 这个问题观察到 新附加元素上的立即 CSS 转换会以某种方式被忽略 转换的最终状态会立即呈现 例如 给定这个 CSS 此处省略前缀 box opacity 0 transition all 2s background color re
  • 根据日期和时间检索 IMAP 电子邮件?

    我正在尝试使用 IMAP 检索不到特定小时数的电子邮件 我查看了规范 有一个 SINCE 方法接受 RFC 日期 但是 它忽略时间和时区 我可以使用另一种方法根据日期和时间检索电子邮件吗 谢谢 RFC 5032记录引入搜索关键字的WITHI
  • jQuery - 如何根据选定的下拉列表显示/隐藏文本框

    抱歉 如果这是非常明显的 但我已经寻找并寻找解决方案 但没有找到任何东西 我对 jQuery 很陌生 所以即使寻找我想做的事情也很困难 我有一个页面 其中包含一堆字段和下拉框 这些字段和下拉框是从数据库填充的 因此 每个下拉列表都在页面加载
  • 如果用户登录到其他网站,则自动登录到当前网站

    我有大约 100 个用 ASP classic 编码的网站 每个网站都接受订单并将其存储在数据库中 然而 这些订单的支付必须在另一个同样使用 ASP classic 进行编码的网站上进行 所有网站均属于同一家公司 托管在同一 IIS 服务器
  • 如何在 Solaris 10 上构建 Qt 5.2?

    Qt 页面未列出适用于 Solaris 的预编译 Qt 5 软件包 搜索了一下 它似乎也没有包含在流行的软件包存储库 OpenCSW 中 一些谷歌点击表明在 Solaris 下构建 Qt 5 涉及 Solaris 10 下的一些工作 因此我