【问题标题】:How do I execute an existing binary that's in the same location as the main cpp file?如何执行与主 cpp 文件位于同一位置的现有二进制文件?
【发布时间】:2022-11-10 16:16:01
【问题描述】:

我正在制作一个严重依赖于另一个 C 二进制文件的程序。由于我不想学习如何使用标头以及尚未学习的内容,因此我想采用简单的方法,只需从我的 cpp 程序中的同一文件夹中运行预编译的二进制文件。

现在,我的文件夹是这样设置的:它有main.cppCMakeLists.txtibootim 二进制文件。在main.cpp 内部,我怎么称呼ibootim

从 python 编码中,它告诉我我应该能够运行

system("./ibootim");

但这不起作用。终端告诉我没有找到文件。显然,如果我将整个路径放入该二进制文件,它将起作用。但是,如果其他用户要下载此文件,则对他们不起作用,因为他们没有与我相同的计算机、用户名等。

所以我的第一个问题,我主要关心的是:

如何在 c++ 程序中运行位于同一目录中的另一个二进制文件?

如果由于某种原因这不可能,那么我可以尝试从源代码下载 ibootim 并可能使用头文件:

如何在 C++ 程序中从 C 头文件执行代码?

【问题讨论】:

  • system() 应该可以工作。也许您的工作目录与应用程序目录不匹配?
  • @HolyBlackCat 我刚刚意识到为什么它不起作用。这是因为我将二进制文件构建在与 ibootim 二进制文件不同的目录中。我可能只是白白发了这个帖子……
  • ibootim 是什么,它来自哪里?
  • @tadman ibootim 是一个用 C 语言编写的程序,它允许用户将 png 转换为 iBoot 图像。这在 iPhone 上用于人们在启动之前将自定义图片发送到 iPhone。许多其他脚本,通常 SSH 脚本使用这种思想来设置自定义启动徽标。您可以在 GitHub 上找到原始来源:github.com/realnp/ibootim
  • @Scheff'sCat 不。我不再那样做了。我正在做 tadman 建议我做的事情。

标签: c++ macos binary binaries


【解决方案1】:

对于 Windows,即使工作目录与 exe 的目录不同,您也可以使用 GetModuleFileNameW() 获取正在运行的 exe 的绝对路径。然后,您可以使用PathRemoveFileSpecW()从路径中删除文件名以获取exe的目录路径。然后,您可以使用ShellExecuteW() 以您想要的文件名启动 exe,同时告诉函数在哪个目录中查找该 exe。

这是一个命令行示例:

#include <windows.h>
#include <shlwapi.h>
#include <iostream>
#include <string>
#include <cwchar>
#include <cstdlib>
#include <cstdint>
#include <stdexcept>
#include <clocale>

using namespace std;

wstring get_exe_dir()  {
    wchar_t buffer[65537] = {L'
【解决方案2】:

在 C++ 中,如果你想使用二进制文件,你可以使用 std::system() 函数。

但要做到这一点,二进制文件必须在 PATH 上。 如果您的二进制文件不在路径上,您可以执行类似的操作。

#include <iostream>

int main(){
#if _WIN32
    std::system("./mybinarie.exe");
#else
    std::system("./mybinarie");
#endif

return 0;
}

使用 std::system 启动 shell 将确保您在工作文件夹中,并且如果二进制文件在工作文件夹中,它应该可以工作。

【讨论】:

  • std::system 接受单个参数。检查 Windows 的正确宏是 _WIN32。我不喜欢为此调用 shell 的想法,而是找到当前目录并手动创建完整路径 (or use realpath)。
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多