gpt4 book ai didi

c++ - osx : external program (qprocess) crash if parent run with open, 但如果父级直接运行则工作正常

转载 作者:行者123 更新时间:2023-11-28 04:58:21 27 4
gpt4 key购买 nike

我在 MacOS 10.13 上遇到了奇怪的情况,找不到它的根源。

我有一个打包的 32 位 Qt 应用程序。由于 MacOS 对其中一项操作的限制,我需要启动一个小的 64 位控制台二进制文件来做一个技巧。这个控制台二进制文件放置在 Contents/MacOS 中,我使用 QProcess 启动它。

如果我从 IDE 运行主应用程序,一切正常。另外,如果我打开终端,cd 到 Contents/MacOS 并直接运行主应用程序,一切都很好。

但是一旦我使用“open myApp.app”或通过 UI 启动它,QProcess exitCode() 就会返回 255,这似乎意味着崩溃。

启动子进程的代码:

QProcess p;
p.start("./papply", QStringList() << osid << filepath);
p.waitForFinished(5000);
qDebug() << p.readAllStandardOutput();
qDebug() << p.readAllStandardError();
qDebug() << p.state();
if(p.state()==QProcess::Running)
{
qDebug() << "peapply freezed - kill";
p.kill();
return false;
}

qDebug() << "Apply" << osid << filepath << "=" << p.exitCode();
return p.exitCode()==0;

任何帮助将不胜感激。

最佳答案

I have 32-bit Qt application packed in a bundle.

首先,以防万一你错过了这个,Apple 已经声明下一版本的操作系统 (10.14) 将不支持 32 位应用程序,因此如果你想在macOS 的 future 版本。

如果您使用调试器,或从包的 Contents/MacOS 文件夹运行二进制文件,它会直接执行。相反,如果您双击一个二进制文件,或从终端使用 open 关键字,则会向 Launch Services 发送一个请求。 , 代表您打开应用程序。

启动服务 (LS) 维护与应用程序的 Bundle Identifier 的关联,该标识符位于应用程序包的 Info.plist 中。文件。

当使用 LS 打开应用程序的请求发生时,LS 会收到应用程序 plist 中的 Bundle Identifier,LS 将执行 registered 中的应用程序,具有该标识符。

在 plist 中,我们还有键 CFBundleExecutable,它被定义为“(推荐) bundle 可执行文件的名称”。这是可能会执行的二进制文件的名称,位于 Contents/MacOS 文件夹中。

请注意,由于 LS 启动与给定标识符相关联的应用程序,如果您的机器上有相同应用程序的拷贝,具有相同的版本号和标识符,它可能不一定会执行您双击的应用程序,运行。

因此,崩溃的原因很可能是由于 LS 启动了不同的应用程序,而不是您认为正在执行的应用程序。确保您的计算机上没有该应用程序的其他拷贝。

如果生成崩溃报告,您应该能够在图像部分的开头看到应用程序的路径,其中包括动态库和框架的路径。

关于c++ - osx : external program (qprocess) crash if parent run with open, 但如果父级直接运行则工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46682600/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com