c++ 获取当前执行文件的绝对路径

at 6个月前  ca Cpp & C  pv 459  by touch  

要在运行时获取当前执行文件的绝对路径,可以使用不同平台特定的API来实现。以下是Windows和Linux平台的具体实现方法。

Windows 平台

在Windows上,可以使用 GetModuleFileName 函数获取当前模块的文件名(包括路径)。

#include <windows.h>
#include <iostream>
#include <string>

std::string getExecutablePath() {
    char path[MAX_PATH];
    GetModuleFileNameA(NULL, path, MAX_PATH);
    return std::string(path);
}

int main() {
    std::string executablePath = getExecutablePath();
    std::cout << "Current executable path: " << executablePath << std::endl;
    return 0;
}

Linux 平台

在Linux上,可以读取 /proc/self/exe 符号链接来获取当前可执行文件的路径。

#include <unistd.h>
#include <limits.h>
#include <iostream>
#include <string>

std::string getExecutablePath() {
    char path[PATH_MAX];
    ssize_t count = readlink("/proc/self/exe", path, PATH_MAX);
    if (count != -1) {
        path[count] = '\0';
        return std::string(path);
    } else {
        throw std::runtime_error("Error getting executable path");
    }
}

int main() {
    try {
        std::string executablePath = getExecutablePath();
        std::cout << "Current executable path: " << executablePath << std::endl;
    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

跨平台实现

为了使代码能够在不同平台上运行,可以使用条件编译来选择适当的实现:

#include <iostream>
#include <string>

#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
std::string getExecutablePath() {
    char path[MAX_PATH];
    GetModuleFileNameA(NULL, path, MAX_PATH);
    return std::string(path);
}
#elif defined(__linux__)
#include <unistd.h>
#include <limits.h>
std::string getExecutablePath() {
    char path[PATH_MAX];
    ssize_t count = readlink("/proc/self/exe", path, PATH_MAX);
    if (count != -1) {
        path[count] = '\0';
        return std::string(path);
    } else {
        throw std::runtime_error("Error getting executable path");
    }
}
#else
#error "Unsupported platform"
#endif

int main() {
    try {
        std::string executablePath = getExecutablePath();
        std::cout << "Current executable path: " << executablePath << std::endl;
    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

以上代码根据当前平台调用相应的函数来获取可执行文件的路径。确保在编译时定义了正确的宏(如 _WIN32__linux__)以选择合适的平台特定代码。这样,你就可以在不同平台上获取当前执行文件的绝对路径。







版权声明

本文仅代表作者观点,不代表码农殇立场。
本文系作者授权码农殇发表,未经许可,不得转载。

 

扫一扫在手机阅读、分享本文

已有0条评论
您是本站第12355名访客 今日有0篇新文章 当前在线 39 人