我有一个程序有许多不同操作系统的二进制文件
我需要获取二进制文件的位置(想想自动更新程序)
如何在“您的”操作系统中这样做?
(将其视为一种挑战:))
编辑注意:该程序可以是可移植的(在闪存驱动器上运行等)或安装的(例如最初以 .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/