C++编程实现获取当前可执行文件名称

 更新时间:2026年03月17日 09:08:51   作者:fpcc  
在C++开发中,有时需要获取当前可执行文件的名称用来处理一些事务,本文总结了在Windows和Linux平台上获取当前可执行文件名称的多种方法,大家可以根据需要进行选择

一、介绍

在C++开发中,有时需要获取当前可执行文件的名称用来处理一些事务。那么,在主流的平台上,获取当前可执行文件名称的方法有哪些呢?一般来说,无论哪个平台下都分为以下几类:

  • 使用接口
  • 使用配置文件或相关属性(注册表等)
  • 使用第三方库

下面将分别在Windows和Linux两大主流平台上进行分析说明。

二、Windows平台

按照上面的三类划分,在Windows平台上获取可执行文件名称的方法有:

1.系统接口

1)使用GetModuleFileName函数,这是在Windows平台上推荐的用法:

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

 int main() {
     char exePath[MAX_PATH]; 
     DWORD len = GetModuleFileNameA(NULL, exePath, MAX_PATH);

     if (len == 0) {
         std::cerr << "err code: " << GetLastError() << std::endl;
         return 1;
     }

     std::string fullPath(exePath);
     std::cout << "cur full path: " << fullPath << std::endl;

     return 0;
 }

2)使用C提供的_get_pgmptr函数来获取_pgmptr

 #include <cstdlib>
 #include <iostream>
 int main() {
     char* pgmptr = nullptr;
     errno_t err = _get_pgmptr(&pgmptr);
     if (pgmptr != nullptr) {
         std::cout << "full path: " << pgmptr << std::endl;
     }
     return 0;
 }

2.配置文件及相关

  • 直接读取main函数中的argv[0],它一般只包括名字而不包括完整路径。这个简单就不举例了。
  • 读取环境变量或配置文件(这需要程序中做一些特殊的输出或配置,普通的可执行文件可能无法应用)

3.第三方库

在Windows平台上有很多的第三方框架或库都提供了类似的机制,如boost::dll::program_location()等。例程看后面。

三、Linux平台

Linux平台亦是如此,但是它的实现方式更加丰富:

1.系统接口

使用dladdr

 #include <iostream>
 #include <dlfcn.h>

 int main() {
     Dl_info dl;
     if (dladdr((void*)main, &dl) && dl.dli_fname) {
         std::cout << "path: " << dl.dli_fname << std::endl;
     }
     return 0;
 }

其它平台一些变种:如Solaris中的getexecname()接口等

2.配置文件及相关

读取/proc/self/exe链接,获取当前可执行文件名称

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

 int main() {
     char exePath[PATH_MAX];
     ssize_t len = readlink("/proc/self/exe", exePath, sizeof(exePath) - 1);
     if (len != -1) {
         exePath[len] = '\0'; 
         std::cout << "full path: " << exePath << std::endl;
     } 
     return 0;
 }

读取/proc/self/cmdline

 #include <iostream>
 #include <fstream>
 #include <string>

 int main() {
     std::ifstream cmdline("/proc/self/cmdline");
     if (cmdline.is_open()) {
         std::string exePath;
         std::getline(cmdline, exePath, '\0');
         std::cout << "full path: " << exePath << std::endl;
     }
     return 0;
 }

使用main函数中的argv[0],不赘述

gunlib中的program_name

这个需要主动初始化,有点类似Windows平台的特殊配置

3.第三库

1)典型的就是使用Boost库中的boost::dll::program_location(),看例子:

 #include <iostream>
 #include <boost/dll/runtime_symbol_info.hpp>

 int main() {
     boost::dll::fs::path fullPath = boost::dll::program_location();
     std::cout << "full path: " << fullPath.string() << std::endl;
     return 0;
 }

2)其它一些特定系统上的库如libbsd等

四、分析说明

除了上面的分析的方法外,另外还可以使用一些特殊的技巧来获取执行文件的名称,比如使用调试的接口(backstarce函数)等等。

通过上面的分析说明,基本上可以看到它们的优缺点。

对使用接口操作来说,优点是安全稳定及准确,但可能无法跨平台。而且可能有的平台上需要安装一些特定的库;

一般来说,使用配置及相关的方法,相对来说都比较准确,通常包括完整的全路径。但缺点是依赖于特定的平台或系统,而且有可能还需要权限。这点就限制了不少的应用,特别是在某些裁剪的系统上的应用;

使用第三方库的优点是应用上简单,灵活多变。缺点是需要安装第三方库而且在编译时需要增加对相关的库的链接。对于一些小的工程就不太实用了。

这里必须单独把使用argv[0]拿出来,它作为一种很传统的获取可执行文件名称的方法,在正式场景下不建议使用。因为影响它的因素比较多,有可能名称根本就不对。所以还是要引起注意。

五、总结

其实在真正的应用中,这种小功能的需求层出不穷。真正和用户打过交道的开发者就会明白,用户有时候想得非常“野”,让开发者有一种应接不暇的感觉。其实换位思考,谁都想让软件的应用更方便快捷。一个小功能往往就会让用户感到软件的人性化。

以上就是C++编程实现获取当前可执行文件名称的详细内容,更多关于C++获取当前可执行文件名称的资料请关注脚本之家其它相关文章!

相关文章

  • LeetCode 单调栈内容小结

    LeetCode 单调栈内容小结

    这篇文章主要介绍了LeetCode 单调栈内容小结,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++控制台实现扫雷游戏

    C++控制台实现扫雷游戏

    这篇文章主要为大家详细介绍了C++控制台实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C 读取ini文件的实例详解

    C 读取ini文件的实例详解

    这篇文章主要介绍了C 读取ini文件的实例详解的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • C语言中结构体(struct)的几种初始化方法

    C语言中结构体(struct)的几种初始化方法

    相信大家都知道struct结构体是C语言中非常重要的复合类型,初始化的方法很多,那么小编下面对这些方法进行总结,便于自己和大家以后查阅,有需要的可以参考借鉴。
    2016-08-08
  • 浅谈c++ stl迭代器失效的问题

    浅谈c++ stl迭代器失效的问题

    下面小编就为大家带来一篇浅谈c++ stl迭代器失效的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
    2016-12-12
  • 利用Qt实现网络数据报文大小端数据的收发

    利用Qt实现网络数据报文大小端数据的收发

    大小端(Endianness)是计算机体系结构的一个术语,它描述了多字节数据在内存中的存储顺序,下面我们来看看如何利用Qt实现网络数据报文大小端数据的收发吧
    2024-11-11
  • C语言函数传递数组和传递地址的区别你知道吗

    C语言函数传递数组和传递地址的区别你知道吗

    这篇文章主要介绍了C语言中数组作为函数的参数以及返回值的使用简单入门,这里以一维数组作为基本条件进行例子讲解,需要的朋友可以参考下
    2021-09-09
  • C++构建缓存加速的实现示例

    C++构建缓存加速的实现示例

    本文主要介绍了C++构建缓存加速的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-10-10
  • c读取一行字符串,以及c++读取一行字符串的实例

    c读取一行字符串,以及c++读取一行字符串的实例

    今天小编就为大家分享一篇c读取一行字符串,以及c++读取一行字符串的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言数据的存储专项分析

    C语言数据的存储专项分析

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-07-07

最新评论