如何在Qt程序中嵌入二进制可执行文件(在运行时执行)? 我正在编写一个跨平台的C++程序,我想在程序中封装/嵌入一个二进制可执行文件。程序应该能够在运行时执行这些二进制文件
我想,我需要使用start()和“:/…”符号的QResource和QProcess,但我似乎无法运行该进程。我有什么遗漏吗?它应该这样工作吗?二进制文件是否需要设置为可执行文件 背景:我正在编写一个使用的工具,我不想要求最终用户手动安装Git (顺便说一句,在Mac OS X上尝试此功能) 更新: 我正在使用以下代码(C++,Mac OS X上的Qt):如何在Qt程序中嵌入二进制可执行文件(在运行时执行)? 我正在编写一个跨平台的C++程序,我想在程序中封装/嵌入一个二进制可执行文件。程序应该能够在运行时执行这些二进制文件,qt,qprocess,Qt,Qprocess,我想,我需要使用start()和“:/…”符号的QResource和QProcess,但我似乎无法运行该进程。我有什么遗漏吗?它应该这样工作吗?二进制文件是否需要设置为可执行文件 背景:我正在编写一个使用的工具,我不想要求最终用户手动安装Git (顺便说一句,在Mac OS X上尝试此功能) 更新: 我正在使用以下代码(C++,Mac OS X上的Qt): QString程序=“:/git”; QStringList参数; 争论我认为资源不起作用。流程由操作系统创建,资源由应用程序处理 一种可能
QString程序=“:/git”;
QStringList参数;
争论我认为资源不起作用。流程由操作系统创建,资源由应用程序处理
一种可能的解决方案是在应用程序目录中的某个位置捆绑其他可执行文件,并从该路径执行它们。那么问题似乎不是从资源中提取git可执行文件,而是执行它
git程序在磁盘上正确生成,您能检查它的权限吗?您不能直接从资源执行程序
如果您在资源中有一个程序,并且您想要执行它,那么您首先必须从资源中读取它,将它写入文件,使文件可执行,然后执行它
此外,当你说你没有收到错误时,这可能意味着你没有正确地检查错误。晚了几年,但这个问题仍然是相关的。我想嵌入时也遇到了同样的问题
在.pro
文件中,添加
# From http://stackoverflow.com/a/37561981
defineReplace(copyToDir) {
files = $$1
DIR = $$2
LINK =
for(FILE, files) {
LINK += $$QMAKE_COPY $$shell_path($$FILE) $$shell_path($$DIR) $$escape_expand(\\n\\t)
}
return($$LINK)
}
defineReplace(copyToBuilddir) {
return($$copyToDir($$1, $$OUT_PWD))
}
# Copy the binary files dependent on the system architecture
win32 {
message("Windows")
QMAKE_POST_LINK += $$copyToBuilddir($$PWD/rclone/windows/rclone.exe)
}else: unix:!macx {
message("Linux")
QMAKE_POST_LINK += $$copyToBuilddir($$PWD/rclone/linux/rclone)
}else: macx: {
# Here we want to place the binaries inside the application bundle, so the
# QMAKE_POST_LINK approach will not work because it places them in the same
# directory as the bundle and not inside it. Instead, use QMAKE_BUNDLE_DATA.
message("macOS")
MediaFiles.files += $$PWD/rclone/macOS/rclone
MediaFiles.path = Contents/MacOS
QMAKE_BUNDLE_DATA += MediaFiles
}
请注意,每个平台都有细微的差异,但总体上方法是相同的
qmake
将此文件复制到目标目录,只需对本地相对目录进行进程调用即可访问这些文件
在下面的代码中,我从QML调用可执行文件,并且在C++中也将非常类似:
var rcloneCommand
if (Qt.platform.os === "windows") {
console.log("Windows")
rcloneCommand = "rclone.exe"
} else {
console.log("OSX/Linux")
rcloneCommand = "./rclone"
}
qProcess.start(rcloneCommand, ["--config", "rclone.conf", "-v", "copy", "--stats", "1s", source, destination]);
请给我们提供源代码。也就是你提到的使用QResource和QProcess的部分。我已经用我正在使用的代码更新了问题谢谢!您能指出如何将它们嵌入到应用程序包(osx)中吗?我想避免安装-一个简单的dmg图像应该是所有用户都必须下载。谢谢Rohan。“不出错”只是“它默默地失败了”的懒话。我想如果我正确地检查,我会得到一个错误:)对于windows:
# From http://stackoverflow.com/a/37561981
defineReplace(copyToDir) {
files = $$1
DIR = $$2
LINK =
for(FILE, files) {
LINK += $$QMAKE_COPY $$shell_path($$FILE) $$shell_path($$DIR) $$escape_expand(\\n\\t)
}
return($$LINK)
}
defineReplace(copyToBuilddir) {
return($$copyToDir($$1, $$OUT_PWD))
}
# Copy the binary files dependent on the system architecture
win32 {
message("Windows")
QMAKE_POST_LINK += $$copyToBuilddir($$PWD/rclone/windows/rclone.exe)
}else: unix:!macx {
message("Linux")
QMAKE_POST_LINK += $$copyToBuilddir($$PWD/rclone/linux/rclone)
}else: macx: {
# Here we want to place the binaries inside the application bundle, so the
# QMAKE_POST_LINK approach will not work because it places them in the same
# directory as the bundle and not inside it. Instead, use QMAKE_BUNDLE_DATA.
message("macOS")
MediaFiles.files += $$PWD/rclone/macOS/rclone
MediaFiles.path = Contents/MacOS
QMAKE_BUNDLE_DATA += MediaFiles
}
var rcloneCommand
if (Qt.platform.os === "windows") {
console.log("Windows")
rcloneCommand = "rclone.exe"
} else {
console.log("OSX/Linux")
rcloneCommand = "./rclone"
}
qProcess.start(rcloneCommand, ["--config", "rclone.conf", "-v", "copy", "--stats", "1s", source, destination]);