Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ osx:external program(qprocess)在父级以open运行时崩溃,但在父级直接运行时工作正常_C++_Macos_Qt_Qprocess - Fatal编程技术网

C++ osx:external program(qprocess)在父级以open运行时崩溃,但在父级直接运行时工作正常

C++ osx:external program(qprocess)在父级以open运行时崩溃,但在父级直接运行时工作正常,c++,macos,qt,qprocess,C++,Macos,Qt,Qprocess,我在MacOS 10.13上遇到了奇怪的情况,但找不到它的根源 我有一个打包的32位Qt应用程序。由于MacOS对其中一个操作的限制,我需要启动一个小的64位控制台二进制文件,这是一个技巧。这个控制台二进制文件放在Contents/MacOS中,我使用QProcess启动它 如果我从IDE运行主应用程序,一切正常。另外,如果我打开一个终端,cd到Contents/MacOS并直接运行主应用程序,一切都会很好 但一旦我使用“openmyapp.app”或通过UI启动它,QProcess exitC

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

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

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

但一旦我使用“openmyapp.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;
qprocessp;
p、 开始(“./papply”,QStringList()
我有一个打包的32位Qt应用程序

首先,为了防止您错过这一点,苹果已经声明下一版本的操作系统(10.14)将不支持32位应用程序,因此如果您想在未来版本的macOS上运行此应用程序,您需要更改此设置

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

启动服务(LS)维护与位于应用程序包文件中的应用程序包标识符的关联

当出现使用LS打开应用程序的请求时,LS将从应用程序的plist中获得
包标识符
,LS将使用该标识符执行已发布的应用程序

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

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

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


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

While@thedarknight提供了大量信息,但这些信息并不完全是答案

对于将面临相同情况的人: 在macOS捆绑包中,应用程序的工作目录与捆绑包相关,但与Windows中的执行文件本身无关

因此,在我的例子中,下一个代码起作用:

QString path = qApp->applicationDirPath();
if(!path.endsWith("/"))
    path += "/";
QProcess p;
p.start(path + "papply", QStringList() << osid << filepath);
QString path=qApp->applicationDirPath();
如果(!path.endsWith(“/”)
路径+=“/”;
过程p;

p、 start(path+“papply”,QStringList())如果更改为使用要执行的程序的绝对路径,该怎么办?如果从UI运行,则“当前工作目录”很可能不正确。@Someprogrammerdude谢谢,我会试试的now@Someprogrammerdude绝对路径有帮助。请将其作为选择的答案。谢谢。这不是我的情况,因为我只有一个正确安装的应用程序实例。但无论如何,您的信息非常有趣和有用。