osx:外部程序(qprocess)崩溃,如果父运行打开,但如果父运行直接运行正常

时间:2017-10-11 07:45:16

标签: c++ macos qt qprocess

我遇到了MacOS 10.13的奇怪情况,无法找到它的根源。

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

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

但是一旦我使用“打开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;

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

  

我将32位Qt应用程序打包在一起。

首先,如果你错过了这个,Apple已经声明下一版本的操作系统(10.14)将不支持32位应用程序,所以如果你想运行这个应用程序,你需要更改它未来版本的macOS。

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

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

当发出使用LS打开应用程序的请求时,LS将从应用程序的plist中显示Bundle Identifier,LS将使用该标识符执行已registered的应用程序。

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

注意,由于LS启动与给定标识符关联的应用程序,如果您的计算机上有相同应用程序的副本,具有相同的版本号和标识符,则可能不一定执行您双击的应用程序,跑。

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

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

答案 1 :(得分:0)

虽然@TheDarkKnight提供的信息并不完全是答案。

对于面临同样情况的人: 在macOS bundle应用程序中有与bundle相关的工作目录,但不包括在Windows中发生的执行文件本身。

所以在我的情况下,下一个代码可以工作:

QString path = qApp->applicationDirPath();
if(!path.endsWith("/"))
    path += "/";
QProcess p;
p.start(path + "papply", QStringList() << osid << filepath);