包括adb与Qt应用程序



我在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 ?

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*变量。它们都需要文件名。

如果不直接或间接地为最终用户提供适当的安装程序,唯一的方法是首先读取内容并将其写入临时文件,如果您真的希望这样做的话。

话虽如此,我个人还是会选择一个真正的安装程序设置。

最新更新