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

标签 c++ path executable

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

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

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

(将其视为一种挑战:))

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

最佳答案

没有可移植的方式。

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

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

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

关于c++ - (多操作系统)获取可执行路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468104/

相关文章:

c++ - 如何对成对的 vector 进行排序?

c++ - 在位域中使用显式类型枚举类时的编译错误 (gcc C++0x/C++11)

python - 在 Windows 上使用 os.path 进行 POSIX 路径操作

windows - 如何在 matlab 中访问 windows 相对路径(例如 %userprofile%)?

java - 寻路 2D Java 游戏?

c++ - 从 C++ 中的空格读取文件

c++ - 指向 C++ 类方法的指针

python-3.x - 无法使用 cx_freeze 创建和运行 python 脚本的独立可执行文件

java - 如何监控 Cloud Foundry 上安装的可执行 jar 应用程序

matlab - 编译后运行matlab代码出错