【问题标题】:(Multi OS) Get Executable Path(多操作系统)获取可执行路径
【发布时间】:2012-09-17 22:46:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 可能是argv[0] 之类的?

标签: c++ path executable


【解决方案1】:

没有便携的方式。

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

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

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

【讨论】:

  • 谢谢你,我已经有类似的东西了(pastebin.com/ffzzxPzi - 我知道 unix 部分有效,但除此之外,未知)并且想知道人们是否有更多
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 2013-09-18
  • 2010-10-17
  • 1970-01-01
  • 2012-07-29
  • 2017-03-25
  • 2015-06-14
  • 2021-01-27
相关资源
最近更新 更多