C++如何获取当前程序运行路径

小敏大大_5656

小敏大大_5656

2026-07-29

787人浏览

原创

windows下用getmodulefilename(null, path, max_path)获取exe完整路径,再调用pathremovefilespec截去文件名;linux/macos分别读/proc/self/exe或调用_nsgetexecutablepath;跨平台应避免依赖argv[0],推荐使用std::filesystem::path安全拼接路径。

c++如何获取当前程序运行路径

Windows下用GetModuleFileName获取exe所在目录

在Windows平台,GetModuleFileName是最直接可靠的方式——它返回当前模块(通常是主exe)的完整路径,包括驱动器和文件名。关键在于传入NULL作为第一个参数,表示获取当前进程的模块路径。

常见错误是只取到exe文件名而没截掉文件名部分,导致后续拼接资源路径失败。正确做法是调用PathRemoveFileSpec(需#include <shlwapi.h></shlwapi.h>)或手动找最后一个'\'位置。

  • 必须链接shlwapi.lib才能用PathRemoveFileSpec
  • 如果程序被快捷方式启动,GetModuleFileName仍返回真实exe路径,不是快捷方式所在路径
  • 返回路径是宽字符(wchar_t*),若用ANSI版本需注意编码兼容性
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
<p>std::wstring get_exe_path() {
wchar_t path[MAX_PATH];
GetModuleFileName(nullptr, path, MAX_PATH);
PathRemoveFileSpec(path);
return std::wstring(path);
}</p></shlwapi.h></windows.h>

Linux/macOS用/proc/self/exe读符号链接

Linux和macOS没有等价的API,但可通过读取/proc/self/exe这个符号链接获得可执行文件的绝对路径。注意:该路径指向的是被加载的二进制文件,不是当前工作目录,也不是启动时的cwd。

容易踩的坑是直接readlink后不处理路径中的软链跳转——比如程序通过硬链接或软链接启动时,/proc/self/exe可能指向原始文件,也可能指向链接目标,取决于系统和调用方式。

  • readlink返回的路径不保证以/结尾,拼接子路径时要手动加/
  • macOS没有/proc,得用_NSGetExecutablePath(返回相对路径,需补全为绝对路径)
  • 某些容器环境(如Docker)中/proc/self/exe可能不可读,需fallback到argv[0]并做realpath
#include <unistd.h>
#include <limits.h>
#include <libgen.h><p>std::string get_exe_dir() {
char path[PATH_MAX];
ssize_t len = readlink("/proc/self/exe", path, sizeof(path)-1);
if (len == -1) return "";
path[len] = '';
char* dir = dirname(path);
return std::string(dir);
}</p></libgen.h></limits.h></unistd.h>

跨平台封装要注意argv[0]的局限性

有人试图用main函数的argv[0]推导路径,但这是最不可靠的方式:argv[0]可能是相对路径、命令名(无路径)、甚至空字符串;shell重定向或execve调用时还能被任意篡改。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

仅当确定程序总以绝对路径启动,且不介意工作目录变更影响时,才考虑realpath(argv[0], nullptr)再dirname。但即便如此,在Windows下argv[0]不含扩展名的情况也常导致realpath失败。

  • POSIX规定argv[0]“通常”是程序名,但“通常”不等于“总是”
  • Windows下GetModuleFileName比argv[0]稳定得多,优先选前者
  • 跨平台库(如Boost.Filesystem)内部其实也是分平台调用上述原生方法,没走argv[0]

获取路径后拼接资源文件要防双重斜杠

拿到目录路径后,拼接配置文件或资源路径时,最容易出错的是手动拼字符串导致//出现——比如get_exe_dir()返回/home/user/app,再加"/config.json"变成/home/user/app//config.json,多数系统能容忍,但某些嵌入式或严格解析器会报错。

更稳妥的做法是用std::filesystem::path(C++17)做拼接,它自动归一化分隔符和冗余斜杠;若不能用C++17,则手写一个安全拼接函数,检查末尾是否已有/或\。

  • std::filesystem::path在Windows下识别\,Linux下识别/,无需条件编译
  • 即使路径含中文或空格,std::filesystem::path也能正确处理,比字符串拼接安全
  • 旧项目若禁用C++17,建议至少封装一次strcat逻辑,避免到处重复判断斜杠

实际项目里,路径获取本身不难,难的是后续所有依赖它的操作——比如加载DLL、读取配置、写日志。一旦路径错了,错误往往延迟暴露,排查成本远高于写对那几行代码。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习