适用于Linux平台库的Steam导致Qt应用程序错误行为

Omn*_*ity 11 c++ linux qt steam

我目前在使用一个非常简单的启动器应用程序时遇到了困难,该应用程序旨在显示一个网页并有一些按钮来启动游戏.单击启动器内部的链接时,只需启动带有链接的默认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();
}
Run Code Online (Sandbox Code Playgroud)

launcher.pro

QT += core gui network webkitwidgets widgets

TARGET = launcher
TEMPLATE = app

SOURCES = main.cpp
Run Code Online (Sandbox Code Playgroud)

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

libQt5Widgets.so libQt5Gui.so libQt5Network.so libQt5Network.so libQt5WebKit.so libQt5MultimediaWidgets.so libQt5OpenGL.so libQt5PrintSupport.so libQt5Multimedia.so libQt5Sensors.so libQt5Quick.so libQt5Qml.so libQt5Sql.so libQt5Positioning.so libQt5DBus.so libicui18n.所以libicuuc.so libicudata.so libssl.so libcrypto.so libstdc ++.so libgcc_s.so

在一个名为platforms的子目录中:

libqxcb.so

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

launch_launcher.sh

#!/bin/sh -e

cd "$(dirname "$0")"

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./launcher
Run Code Online (Sandbox Code Playgroud)

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

实际上,如果$LD_LIBRARY_PATH从launch_launcher脚本中删除以便该行只读取,LD_LIBRARY_PATH=. ./launcher则链接可以正常工作.但是$LD_LIBRARY_PATH启用链接不起作用.我们需要$LD_LIBRARY_PATH工作才能使用Steam Linux平台库(这使游戏工作.)

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

fbu*_*cek 0

我猜你的问题更复杂。只是想你可以尝试什么。

1)你的应用程序可能不需要使用LD_LIBRARY_PATH

为了不要弄乱应用程序中的 LD_LIBRARY_PATH,您可以将库搜索路径放入您的程序中。(Linux解决方案)

App structue
/app/bin
/app/lib    // where all my libraries are including Qt libraries
Run Code Online (Sandbox Code Playgroud)

。轮廓

QMAKE_RPATHDIR = \$\$ORIGIN/../lib
QMAKE_LFLAGS_RELEASE += \'-Wl,-rpath,$${QMAKE_RPATHDIR}\'
QMAKE_RPATHDIR =
Run Code Online (Sandbox Code Playgroud)

(不记得为什么它在我的旧应用程序中看起来如此愚蠢 - 但它有效,而且目前我不在 Linux 上来简化它)

2) 仅为应用程序内的进程设置 LD_LIBRARY_PATH(不要使LD_LIBARY_PATH太复杂。应用程序、steam等的路径)

我不知道新浏览器在什么上下文中执行,但如果它是您的应用程序,您可以使用这种方法。这确保只有应用程序中的进程才会具有此 LD_LIBRARY_PATH

您可以使用以下命令在应用程序中设置 LD_LIBRARY_PATH

setenv("LD_LIBRARY_PATH", yourPath.toLatin1().data(), 1)
// You can test it using
QProcessEnvironment::systemEnvironment().value("LD_LIBRARY_PATH");
Run Code Online (Sandbox Code Playgroud)

我猜你不使用 QProcess 所以,为进程本身设置环境是不可能的。