我遇到了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;
非常感谢任何帮助。
答案 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);