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++获取当前可执行文件名称的资料请关注脚本之家其它相关文章!

相关文章

  • C++ OpenCV实现像素画的示例代码

    C++ OpenCV实现像素画的示例代码

    这篇文章主要介绍了通过OpenCV进行图片像素的变化,从而形成像素画效果的功能。文中的示例代码讲解详细,感兴趣的小伙伴可以动手试一试
    2022-01-01
  • C++实现线程同步的四种方式总结

    C++实现线程同步的四种方式总结

    这篇文章主要为大家详细介绍了C++实现线程同步的四种方式,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下
    2022-11-11
  • 使用C语言实现动态数组Vector

    使用C语言实现动态数组Vector

    这篇文章主要为大家详细介绍了使用C语言实现动态数组Vector的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 详解C语言中index()函数和rindex()函数的用法

    详解C语言中index()函数和rindex()函数的用法

    这篇文章主要介绍了C语言中index()函数和rndex()函数的用法,是C语言入门学习中的基础知识,要的朋友可以参考下
    2015-08-08
  • OpenCV利用霍夫变换实现交通车道线检测

    OpenCV利用霍夫变换实现交通车道线检测

    经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆。本文就来利用霍夫变换实现交通车道线检测,需要的可以参考一下
    2022-09-09
  • C++你最好不要做的几点小结

    C++你最好不要做的几点小结

    整理如下,主要是方便刚开始接触c++的朋友
    2013-01-01
  • C++替换栈中和.data中的cookie实现步骤详解

    C++替换栈中和.data中的cookie实现步骤详解

    这篇文章主要介绍了C++替换栈中和.data中的cookie实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C语言进阶:指针的进阶(1)

    C语言进阶:指针的进阶(1)

    这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下
    2021-09-09
  • C/C++中的名字空间与作用域示例详解

    C/C++中的名字空间与作用域示例详解

    这篇文章主要给大家介绍了关于C/C++中名字空间与作用域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c/c++具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-09-09
  • 如何用C++实现A*寻路算法

    如何用C++实现A*寻路算法

    寻路是游戏比较重要的一个组成部分。因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能。本文将介绍一个经常被使用且效率理想的寻路方法-A*寻路算法,并且提供额外的优化思路
    2021-06-06

最新评论