c++ - 获取被调用文件的路径

假设我有以下文件夹结构

/dir/dir2/dir3/program.exe

我想获得被调用的 program.exe 文件路径。例如。

// program.exe
#include <iostream>
#include <filesystem>

int main(int argc, char** argv)
{
    std::cout << std::filesytem::current_path() << "\n";
}

但是如果从不同的位置调用,这个 program.exe 的工作方式会有所不同:

  • dir3

    user@command_line:/dir/dir2/dir3$ ./program.exe

    输出:"/dir/dir2/dir3"
  • dir2

    user@command_line:/dir/dir2$ ./dir3/program.exe

    输出:"/dir/dir2"
  • dir

    user@command_line:/dir$ ./dir2/dir3/program.exe

    输出:"/dir"

我希望我能获得 program.exe 的确切路径,无论它是从哪个位置调用的。有可能吗?

感谢您抽出宝贵时间。

回答1

您正在寻找一个包含工作可执行文件的文件夹。当前路径给你一个https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getcurrentdirectory

获取可执行路径

对于 Windows,您可以使用 https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulefilenamea Win API 函数:

例如:

char  exe_name[ MAX_PATH+1 ] = {'\0'};
::GetModuleFileNameA(nullptr,exe_name,MAX_PATH);

对于 POSIX,您可以使用 https://man7.org/linux/man-pages/man2/readlink.2.html 系统调用获取可执行路径

例如:

char  exe_name[ PATH_MAX+1 ] = {'\0'};
char query[64] = {'\0'};
std::snprintf(query, 64, "/proc/%u/exe", ::getpid() );
::readlink(query, exe_name, PATH_MAX);