C++项目中如何跨平台获取其他项目文件的绝对路径?
跨平台获取图片资源目录解决方案
核心实现逻辑
通过系统接口直接获取当前可执行文件的绝对路径,再结合你给出的目录结构拼接出images文件夹路径,完全规避argv[0]不可靠的问题,不受进程工作目录影响。
工具函数实现
依赖C++17标准的std::filesystem处理路径,自动适配Windows/Linux的路径分隔符:
#ifdef _WIN32 #include <windows.h> #else #include <unistd.h> #include <limits.h> #endif #include <filesystem> #include <stdexcept> namespace fs = std::filesystem; // 获取当前可执行文件的绝对路径 fs::path get_executable_path() { #ifdef _WIN32 WCHAR path_buf[MAX_PATH] = {0}; if (GetModuleFileNameW(NULL, path_buf, MAX_PATH) == 0) { throw std::runtime_error("获取可执行文件路径失败"); } return fs::path(path_buf); #else char path_buf[PATH_MAX] = {0}; ssize_t read_len = readlink("/proc/self/exe", path_buf, sizeof(path_buf) - 1); if (read_len == -1) { throw std::runtime_error("获取可执行文件路径失败"); } path_buf[read_len] = '\0'; return fs::path(path_buf); #endif } // 拼接得到images文件夹绝对路径 fs::path get_images_dir() { fs::path exe_path = get_executable_path(); // 两次parent_path:第一次拿到bin目录,第二次拿到项目根目录(bin和images同级) fs::path project_root = exe_path.parent_path().parent_path(); return project_root / "images"; }
构建配置适配
Linux CMake配置
在根目录的CMakeLists.txt中添加以下配置,确保可执行文件输出到项目根目录的bin文件夹,同时开启C++17支持:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
Windows Visual Studio配置
打开项目属性页,做全局配置(配置选「所有配置」,平台选「所有平台」):
- 进入「配置属性 > 常规」,将「输出目录」修改为
$(SolutionDir)bin\ - 进入「配置属性 > C/C++ > 语言」,将「C语言标准」修改为「ISO C17标准(/std:c++17)」或更高版本
部署说明
如果需要打包发布程序,只需要将images文件夹拷贝到和bin目录同级的安装路径下,上述路径逻辑无需修改即可正常运行。如果需要自定义系统级安装路径,可以通过编译宏传入安装前缀,分别适配开发调试和正式发布场景。
内容的提问来源于stack exchange,提问作者Vinicius Almada
相关产品推荐
相关产品推荐

