(多操作系统)获取可执行路径

时间:2012-09-17 22:46:16

标签: c++ path executable

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

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

如何在'你的' OS?

(把它想象成挑战,各种各样的:))

编辑注意:该程序可以是便携式(运行闪存驱动器等)或安装(例如最初以.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部分,我不知道其他任何事情)

1 个答案:

答案 0 :(得分:3)

没有可移植的方式。

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

  • Windows:调用GetModuleFileNameW(nullptr)以获取执行程序的路径
  • MacOS:使用[[NSBundle mainBundle] bundlePath]获取主bundle目录(还有一个可执行文件本身的调用,但大多数时候你想要找到你的数据文件)。你需要将这篇文章编译为Objective-C ++;我正在考虑使用CFBundle,但当时发现它太乱了。
  • Linux:没有“非常好”的方式。我决定使用readlink(/ proc /< mypid> / exe),这在大多数情况下都适用。通过硬链接调用程序时会失败。

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