我在OS X上使用Qt 5.3。我有一个依赖于android工具adb的程序,所以我试图将它作为资源包含。
在我的项目文件中,我有:
RESOURCES = app.qrc
在app.qrc中我有:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>assets/adb</file>
</qresource>
在我的应用中:
QResource::registerResource("app.rcc");
// I've run with and w/o a compiled .rcc file. No difference.
QProcess *kill_adb=new QProcess;
kill_adb->start("/assets/adb kill-server");
kill_adb->waitForFinished(-1);
int exitcode = kill_adb->exitCode();
QString s = QString::number(exitcode);
QMessageBox::critical(
this,
tr("exit code:"),
s);
delete kill_adb;
对/ assets / adb的调用失败。如果我使用本地adb的路径,则代码可以正常工作。如何在程序中包含adb?
答案 0 :(得分:0)
QProcess只能在您的文件系统上执行真实文件。如果您没有文件,则无法执行文件。
Gnu / Linux,Windows,Android,Mac等只能执行文件,因为它们是基于文件系统的操作系统。 QProcess遵循这一点,这就是它内部归结为至少在Linux上的原因:
static inline int qt_safe_execve(const char *filename, char *const argv[],
char *const envp[])
{
int ret;
EINTR_LOOP(ret, ::execve(filename, argv, envp));
return ret;
}
static inline int qt_safe_execv(const char *path, char *const argv[])
{
int ret;
EINTR_LOOP(ret, ::execv(path, argv));
return ret;
}
static inline int qt_safe_execvp(const char *file, char *const argv[])
{
int ret;
EINTR_LOOP(ret, ::execvp(file, argv));
return ret;
}
正如您所看到的,它将调用不同的exec *变体,然后通过相同的系统调用。它们都需要文件名。
如果没有直接或间接向最终用户提供适当的安装程序,唯一可以实现的方法是首先读取内容并将其写入临时文件中,如果你真的希望这样做的话。
话虽这么说,我个人会去寻找真正的安装程序。