1

我有一个包含许多不同操作系统的二进制文件的程序

我需要获取二进制文件的位置(想想自动更新程序)

如何在“你的”操作系统中这样做?

(把它想象成一个挑战,有点:))

编辑注意:该程序可以是可移植的(运行闪存驱动器等)或安装(例如最初以 .deb 格式)

EDIT2:这是我已经拥有的:

/**
 * Get the location of the executable
 * @return the location of the executable, as a string.
 */
const char *GetExecutableLocation()
{
   const char *path;
   char buf[1024];

   #if defined (WIN32) || defined (WIN64)
      GetModuleFileName(path, &size);
   #elif defined (__APPLE__)
      _NSGetExecutablePath(path, &size);
   #elif defined(UNIX)
      if (readlink("/proc/self/exe", buf, sizeof(buf)) == -1) path = buf;
   #elif defined(__FreeBSD__)
      int mib[4];
      mib[0] = CTL_KERN;
      mib[1] = KERN_PROC;
      mib[2] = KERN_PROC_PATHNAME;
      mib[3] = -1;
      sysctl(mib, 4, buf, sizeof(buf), NULL, 0);
      path = buf;
   #elif defined(SUNOS)
      path = getexecname();
   #endif
   return path;
}

(请注意,我只测试了 unix 部分,我不知道其他任何内容)

4

1 回答 1

3

没有便携的方式。

主要操作系统的粗略想法(我在这里省略了细节):

  • Windows:调用 GetModuleFileNameW(nullptr) 获取执行程序的路径
  • MacOS:使用 [[NSBundle mainBundle] bundlePath] 来获取主包目录(也有对可执行文件本身的调用,但大多数时候你想找到你的数据文件)。您需要将此部分编译为 Objective-C++;我当时正在考虑使用 CFBundle,但当时发现它太乱了。
  • Linux:没有“真正好的”方法。我选择了 readlink(/proc/<mypid>/exe),它在大多数情况下都可以使用。当程序通过硬链接调用时,它将失败。

注意:argv[0] 一般是没用的;它给出了用于在控制台环境中调用程序的名称,但不解析 shell 搜索路径,并且在某些环境中可能不可用。它在 Windows GUI 程序中不存在,当您通过 GUI 运行程序时,我什至不确定 MacOS 作为 argv[0] 传递的内容。

于 2012-09-17T23:51:49.783 回答