我目前在使用非常简单的启动器应用程序时遇到困难,该应用程序旨在显示网页并具有一些用于启动游戏的按钮。当您单击启动器内部的链接时,它旨在仅通过该链接启动默认的Web浏览器,而不是接受和处理导航请求。

但是,通过Steam启动时,链接无法在新的Web浏览器中打开。确切的行为取决于环境,我已经收到有关挂起gvfs-openxdg-open的拷贝的报告,尽管在我的环境中,它只是提供鼠标指示Firefox正在瞬间打开并且什么也不做(包括根据strace根本不启动任何进程) ,可能与KDE的消息传递系统有关(我不知道)。十分令人烦恼的是,也有报道称它运行良好。因此,在确定确切的问题上时,我遇到了很大的问题。

我设法将问题缩小到Steam修改可执行文件的LD_LIBARRY_PATH以使用Steam的Linux平台。我已经将启动器所需的所有库与启动器捆绑在一起。

这是一个最小的可复制指南:

main.cpp

#include <QApplication>
#include <QWebFrame>
#include <QDesktopServices>
#include <QNetworkRequest>
#include <QMessageBox>
#include <QWebView>

class WebPage : public QWebPage {
public:
  bool acceptNavigationRequest(QWebFrame*, const QNetworkRequest &request, NavigationType) {
    QDesktopServices::openUrl(request.url());
    return false;
  }
};

class WebView : public QWebView {
public:
  QWebView* createWindow(QWebPage::WebWindowType) {
    WebView* res = new WebView;
    WebPage* page = new WebPage;
    res->setPage(page);
    return res;
  }
};

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);

  WebView v;
  v.load(QUrl("http://example.com/"));
  v.show();

  return a.exec();
}

launcher.pro
QT += core gui network webkitwidgets widgets

TARGET = launcher
TEMPLATE = app

SOURCES = main.cpp

您还需要复制并捆绑以下库(标准Qt部署):

libQt5widgets.so所以libicuuc.so libicudata.so libssl.so libcrypto.so libstdc++。so libgcc_s.so

并在名为platform的子目录中:

libqxcb.so

然后是最后一个将它捆绑在一起的脚本:

launch_launcher.sh
#!/bin/sh -e

cd "$(dirname "$0")"

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./launcher

最后,安装好Steam,并将其设置为LD_LIBRARY_PATH并导出并运行launch_launcher.sh(这些确切路径取决于您的Steam安装。)

本质上,如果您从launch_launcher脚本中删除$LD_LIBRARY_PATH,以便该行仅读取LD_LIBRARY_PATH=. ./launcher,则链接有效。但是,启用了$LD_LIBRARY_PATH的链接将不起作用。我们需要$LD_LIBRARY_PATH才能使用Steam Linux平台库(使游戏正常运行)。

解决此问题的最佳方法是什么?我如何找到负责的库并将其排除或以其他方式解决此问题?

最佳答案

因此,我正在解决这一部分(如先前问题注释中所述)



不是这个



原因是,如果您使用的是受 Steam 支持的Linux配置,则LD_LIBRARY_PATHs应该是所有应用程序(特别是商业应用程序)的最后设置。如果它与其他库/应用程序混淆,那是他们的错误。

隔离再现的方法从根本上是有效的。逻辑扩展是(如注释中所示)继续:

LD_LIBRARY_PATH={myentry}:A:B:C
./launcher

代替
LD_LIBRARY_PATH={myentry}:${LD_LIBRARY_PATH}
./launcher

这使您可以在“A:B:C”(这是当前的LD_LIBRARY_PATH,包括Steam库条目)中进行选择,并确定哪些条目保留下来会使您的应用重新开始工作。

至于解决方法,它取决于您系统上的几个变量(您的发行版,LD_LIBRARY_PATH下的其他已安装的库,您的Qt版本与KDE的Qt版本)。您可以尝试:
  • 搜索解决方法-它可能很简单,例如替换库文件,Qt补丁程序或从主函数调用的单个函数(类似于@fbucek的答案)。
  • 使用Steam和Qt记录错误报告-因此,此解决方法不特定于您的系统,并且在下次Steam更新中也不会再次被破坏。

  • 编辑:您观察到受影响的是QDesktopServices-我最有可能的猜测是KDE,您的KDE和Steam之间的Qt版本不同。

    关于c++ - Steam for Linux平台库导致Qt应用程序异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28997187/

    10-11 12:29