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

时间:2015-03-11 20:55:55

标签: 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();
}

launcher.pro

QT += core gui network webkitwidgets widgets

TARGET = launcher
TEMPLATE = app

SOURCES = main.cpp

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

libQt5Widgets.so libQt5Gui.so libQt5Core.so libQt5Network.so libQt5WebKitWidgets.so libQt5WebKit.so libQt5MultimediaWidgets.so libQt5OpenGL.so libQt5PrintSupport.so libQt5Multimedia.so libQt5Sensors.so libQt5Quick.so libQt5Qml.so libQt5Sql.so libQt5Positioning.so libQt5DBus。所以libicui18n.so 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

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

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

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

2 个答案:

答案 0 :(得分:1)

所以,我正在解决这个问题(正如之前的问题评论中所解释的那样)

  

解决此问题的最佳方法是什么?我怎样才能找到负责任的图书馆

而不是这个

  

并将其排除或以其他方式解决此问题?

原因在于,如果你使用支持蒸汽的Linux配置,LD_LIBRARY_PATHs应该是任何应用程序(尤其是商业应用程序)的最后设置。如果它与其他库/应用程序混淆,那就是他们的错误。

你在分离repro方面的方法从根本上说是有效的。逻辑扩展名(如评论中)继续:

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

而不是

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

这使你可以选择&#34; A:B:C&#34; (这是包含Steam库条目的当前LD_LIBRARY_PATH),并确定将哪些条目输出使您的应用程序重新开始工作。

至于解决它,它取决于你的系统上的几个变量(你的发行版,LD_LIBRARY_PATH下的其他已安装的库,你的Qt版本与KDE的Qt版本)。你可以尝试:

  1. 谷歌搜索解决方法 - 它可能像替换库文件,Qt补丁或您从主函数调用的单个函数一样简单(类似于@ fbucek&#39;答案)。
  2. 使用Steam和Qt记录错误报告 - 因此,此解决方法并非针对您的系统,并且在下次Steam更新时不会再次中断。
  3. 编辑你发现受影响的是QDesktopServices - 我最可能猜到的是两个KDE,你和Steam之间的Qt版本不同。

答案 1 :(得分:0)

我猜你的问题更复杂。想想你能尝试什么。

1)你的app可能不需要使用LD_LIBRARY_PATH

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

App structue
/app/bin
/app/lib    // where all my libraries are including Qt libraries

.pro文件

QMAKE_RPATHDIR = \$\$ORIGIN/../lib
QMAKE_LFLAGS_RELEASE += \'-Wl,-rpath,$${QMAKE_RPATHDIR}\'
QMAKE_RPATHDIR =

(不记得为什么它在我的旧应用程序中看起来很愚蠢 - 但是它有效并且此时我不在linux上来简化它)

2)仅为应用程序中的进程设置LD_LIBRARY_PATH (不要使LD_LIBARY_PATH太复杂。应用程序的路径,蒸汽等)

我不知道在什么情况下新的浏览器被执行但是如果它是你的应用程序你可以使用这个方法。 这样可以确保只有应用程序中的进程才具有此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");

我猜你不会使用QProcess,因此设置过程本身的环境是不可能的。