Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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++ 将adb包含在Qt应用程序中_C++_Qt_Qt5_Qprocess_Qresource - Fatal编程技术网

C++ 将adb包含在Qt应用程序中

C++ 将adb包含在Qt应用程序中,c++,qt,qt5,qprocess,qresource,C++,Qt,Qt5,Qprocess,Qresource,我在OSX上使用Qt5.3。我有一个依赖于android工具adb的程序,所以我尝试将它作为一个资源 在我的项目文件中,我有: RESOURCES = app.qrc 在app.qrc中,我有: <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>assets/adb</file> </qresource> 调用/assets/adb失败。如果我使用本地adb的

我在OSX上使用Qt5.3。我有一个依赖于android工具adb的程序,所以我尝试将它作为一个资源

在我的项目文件中,我有:

RESOURCES = app.qrc
在app.qrc中,我有:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>assets/adb</file>
</qresource>

调用/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*变量,这些变量随后将通过相同的系统调用。它们都需要文件名

如果不直接或间接向最终用户提供正确的安装程序,唯一可行的方法是首先读取内容并将其写入临时文件(如果您确实希望这样做)


也就是说,我个人会选择真正的安装程序设置。

adb是一个OSX二进制文件。我只想将其包含在我的程序中,这样最终用户就不必安装android sdk。这可能吗?@Jocala:是的,如果你先把文件写到磁盘上,这是可能的,但总体来说,这是否合理,这是值得怀疑的。你为什么不给他们一个合适的安装程序呢?好吧,我想我明白你的意思了。由于Qt将资源直接编译到程序中,客户端操作系统将无法在assets/adb中看到该程序,因为它不存在于实际的文件系统中:它是可执行文件中的一个blob。对我来说,将adb包含在安装程序中,将其放入操作系统可以访问的已知位置会更容易access@Jocala:是的,没错。:)
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;
}