1

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

4

1 回答 1

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* 变体,然后通过相同的系统调用。它们都需要文件名。

如果您确实希望这样做,那么在没有直接或间接向最终用户提供适当安装程序的情况下使其成为可能的唯一方法是首先读出内容并将其写入临时文件。

话虽如此,我个人会去进行真正的安装程序设置。

于 2014-05-25T06:48:28.097 回答