C++ 将adb包含在Qt应用程序中
我在OSX上使用Qt5.3。我有一个依赖于android工具adb的程序,所以我尝试将它作为一个资源 在我的项目文件中,我有: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的
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;
}