我目前遇到了一个非常简单的启动器应用程序的困难,其目的是显示一个网页,并有一些button来启动游戏。 当你点击启动器中的链接时,它只是简单地启动你的默认浏览器链接,而不是接受和处理导航请求。
但是,通过Steam启动时,链接无法在新的浏览器中打开。 确切的行为取决于环境,我已经报告了gvfs-open和xdg-open挂起的副本,尽pipe在我的环境中,它只是简单地给鼠标指示firefox打开了一秒钟,什么都不做(包括没有进程一切按照,可能与KDE的消息传递系统有关,我不知道)。 还好,还有报道说它工作正常。 所以我在解决确切的问题上遇到了相当的问题。
我已经设法缩小问题到蒸汽修改可执行文件的LD_LIBARRY_PATH使用蒸汽的Linux平台。 我已经将发射器所需的所有库与发射器捆绑在一起。
这是一个最小的重现指南:
C#启动应用程序进程而不偷窃重点
Python:打破SteamCMD提示
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.so libicui18n。 so libicuuc.so libicudata.so libssl.so libcrypto.so libstdc ++。so libgcc_s.so
而在一个名为平台的子目录中:
libqxcb.so
然后最后一个脚本把它绑在一起:
launch_launcher.sh
#!/bin/sh -e cd "$(dirname "$0")" LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./launcher
最后,安装蒸汽并将其设置为LD_LIBRARY_PATH,并将其导出并运行launch_launcher.sh(这些确切的path取决于您的蒸汽安装)。
实质上,如果从launch_launcher脚本中删除$LD_LIBRARY_PATH ,以使该行只读取LD_LIBRARY_PATH=. ./launcher LD_LIBRARY_PATH=. ./launcher然后链接工作。 但启用$LD_LIBRARY_PATH链接不起作用。 我们需要$LD_LIBRARY_PATH才能使用Steam Linux平台库(这使得游戏能够正常工作)。
解决此问题的最佳方法是什么? 我怎样才能find负责任的图书馆,排除它或以其他方式解决这个问题?
所以,我正在处理这个部分(正如前面的问题评论所解释的那样)
而不是这个
并排除它或以其他方式解决这个问题?
理由是如果你使用蒸汽支持的Linux配置,LD_LIBRARY_PATHs应该是任何应用程序(特别是商业应用程序)的最后一个设置。 如果它与其他库/应用程序混淆,这是他们的错误。
你的方法在隔离repro方面基本上是有效的。 逻辑扩展是(如在评论中)继续:
LD_LIBRARY_PATH={myentry}:A:B:C ./launcher
代替
LD_LIBRARY_PATH={myentry}:${LD_LIBRARY_PATH} ./launcher
这允许你在“A:B:C”(这是包括Steam库条目的当前LD_LIBRARY_PATH)中挑选樱桃,并确定离开哪些条目使得你的应用再次开始工作。
至于解决这个问题,它取决于你的系统上的几个变量(你的发行版,LD_LIBRARY_PATH下的其他已安装的库,Qt版本与KDE的Qt版本)。 你可以尝试:
搜索变通办法 – 它可能就像替换库文件或Qt修补程序一样简单,或者从主函数调用的单个函数(类似于@ fbucek的答案)。
使用Steam和Qt记录错误报告 – 所以这个解决方法不是特定于你的系统的,并且在下次Steam更新时不会再被破坏。
编辑:你观察到QDesktopServices受到了影响 – 我最有可能的猜测是KDE,你和Steam之间的Qt版本不同。
我猜你的问题比较复杂。 只是想到你可以尝试。
1)您的应用程序可能不需要使用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,为流程本身设置环境是没有问题的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。