首页 > 编程语言 >c/c++程序中获取当前可执行文件所在的目录路径,使用跨平台的program_location

c/c++程序中获取当前可执行文件所在的目录路径,使用跨平台的program_location

时间:2023-04-27 20:11:47浏览次数:45  
标签:可执行文件 路径 c++ 跨平台 program path include

c/c++程序中获取当前可执行文件所在的目录路径

对于大型工程中,可执行文件中通过c/c++代码获取到当前路径,可以很大方便于工程后续的部署与运维工作。

比如说根据当前的可执行文件路径获取到配置文件的路径,然后加载读取配置文件。

有了这个能力就不用再在操作系统中配置环境变量来指定当前工程的目录了,让事情变得简单了不少。

由于c++在语言层面并没有获取可执行文件相关的定义,所示各个平台操作系统都有自己的不同实现。例如:

linux下可以通过系统调用readlink读取/proc/self/exe数据,如下面代码所示:

#pragma once
#include <string>
#include <unistd.h>

//////////////////////////////////////////////////////////
// for linux platform

namespace vi
{
    class vdirectory
    {
    public:
        //get current executor abslout full path (filename with path)
        static std::string get_current_executor_path()
        {
            const std::size_t MAXBUFSIZE = 2048;
            char buf[MAXBUFSIZE] = {'\0'};
            readlink("/proc/self/exe", buf, MAXBUFSIZE);
            return std::string(buf);    // 0 is for heap memory
        }
    };

}

 

但是这方法并不能在windows和macos平台上使用。它们分别有自己的实现。如windows下使用GetModuleFileName实现,示例代码如下:

#include <stdio.h>
#include <windows.h>
int main()
{
    char ExeFile[256];
    //得到当前文件路径名
    GetModuleFileName(NULL,ExeFile,200);
    printf("当前文件路径为:\n");
    printf("%s\n",ExeFile);
    return 0;
}

 

上面的这些实现,各自都不具备跨平台性。

更好的跨平台解决方案:

浏览boost文档,无意中发现了一个新库:dll,这个库里有个program_location函数可以获得当前可执行文件的全路径。代码如下所示:

#include <boost/dll/runtime_symbol_info.hpp>

 
boost::dll::fs::path path_exec = boost::dll::program_location();
std::cout<<"this executor path is:"<<path_exec.string()<<std::endl;

 

经测试,这一方法可以在多个常用的OS平台上成功使用。

所以写下此文分享给大家。

 

标签:可执行文件,路径,c++,跨平台,program,path,include
From: https://www.cnblogs.com/colin-vio/p/17360099.html

相关文章

  • C++
    狗的继承完成两个类,一个类Animal,表示动物类,有一个成员表示年龄。一个类Dog,继承自Animal,有一个新的数据成员表示颜色,合理设计这两个类,使得测试程序可以运行并得到正确的结果。 #include<iostream>usingnamespacestd;classAnimal{public:Animal(inty)......
  • c++引用折叠
    目录 一、引用折叠二、示例解析三、参考: 一、引用折叠   由于存在T&&这种万能引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这是经过类型推导的T&&类型,相比右值引用(&&)会发生类型的变化,这种变化就称为引用折叠。1.所有右值引用折叠到右值引......
  • [C++11]左值、右值、左值引用、右值引用小结
     左值和右值左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。比如inta=b+c;,a就是一个左值,可以对a取地址,而b+c就是一个右值,对表达式b+c取地址会报错。C++11中右值又由两个概念组成:将亡值和纯......
  • C++ inline
    在C++中,inline关键字用于建议编译器将函数内联到调用它的地方。内联函数是一种优化技术,可以减少函数调用的开销。当一个函数被声明为内联时,编译器会尝试将函数的代码直接嵌入到每个调用该函数的地方,从而避免了函数调用时产生的额外开销,如保存寄存器、设置栈帧等。需要注意的是,inl......
  • 【C++】引用、引用初始化、引用折叠规则
     引用引用就好像存储数据的一块内存区域(变量)的一个名字,定义引用就好像声明了一个变量名并把它绑定到已存在的变量上,变量名附带属性(包括但不限于类型、存储期),变量名附带的属性由声明变量名时使用的声明指定符决定。需要注意的是,用于声明左值引用的&和用于声明右值引用的&&不......
  • 开心档之C++ 预处理器
    C++预处理器预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是C++语句,所以它们不会以分号(;)结尾。我们已经看到,之前所有的实例中都有 #include 指令。这个宏用于把头......
  • 开心档之C++ 多态
    C++多态多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类Shape被派生为两个类,如下所示:实例#include<iostream>usingnamespac......
  • 开心档之C++ 引用
    C++引用引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。C++引用vs指针引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始......
  • 开心档之C++ STL 教程
    C++STL教程在前面的章节中,我们已经学习了C++模板的概念。C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以下三个组件:组件描述容......
  • c++打卡第十七天
    一、问题描述二、设计思路①、对于每个小孩得所得到的糖果数我们可以定义一个数组存储它们。②、需要进行循环结构,同时循环停止的条件为10个小孩得糖果数相同。③、小孩所得得糖果为奇数时需要向老师要一块后才再次分一半给后一个小朋友,这时候我们需要选择结构来实现。④、我们......