c/c++获取可执行程序的绝对路径(Linux、Windows)

7 篇文章 1 订阅
6 篇文章 0 订阅

     今天改动一个程序,需要在linux环境获取执行程序的绝对路径,搜索到两个函数,在此做下记录和对比。

      函数1:char *getcwd(char *buf, size_t size);

      头文件:unistd.h

      获取到可执行程序的绝对路径,存放到buf中,size是指定的buf大小。若size指定的大小比 buf短,会返回NULL。若不知道buf的长度,可以设置size为0,则getcwd会调用malloc动态给buf分配空间,不过后续要记得调用free释放buf。

     不足:使用后发现,该函数返回的是执行可执行程序的绝对路径。

 

    函数2:int readlink(const char * path ,char * buf,size_t bufsiz);

    头文件:unistd.h

    该将参数path的符号连接内容存到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾。返回值即为字段buf的长度。

若传入的参数bufsiz小于符号连接的内容长度,过长的内容会被截断。

  不足:这个函数并不是直接获取程序的绝对路径,是通过获取当前程序的自身信息拿到的路径。且得到的路径包括了可执行程序名称,需要再处理。

eg:在路径/home/alex/test-getpath上写了个测试代码

#include<stdio.h>
#include<string.h>
#include<unistd.h>

int main()
{
    char szBuf[128];
    char szPath[128];
    
    memset(szBuf, 0x00, sizeof( szBuf));    
    memset( szPath, 0x00, sizeof(szPath));

    getcwd(szBuf, sizeof(szBuf)-1);
    printf("buf:%s\n", szBuf);

    int ret =  readlink("/proc/self/exe", szPath, sizeof(szPath)-1 );
    printf("ret:%d\n", ret);
    printf("path:%s\n", szPath);

    return 0;

}

若是在/home/alex/test-getpath路径执行,得到结果:

若是在/home路径执行,得到结果:

补充:

windows环境,有类似的替代函数。

函数1:头文件:#include<direct.h>

函数:char * getcwd(char * buf, size_t size);

用法类似,获取得到的结果是执行文件的目录。

函数2:头文件:#include<windows.h>

函数:DWORD WINAPI GEtModuleFileName(

      _In_opt_  HMODULE hModule,   //应用程序或DLL实例句柄,NULL则为获取当前程序可执行文件路径名
      _Out_     LPTSTR lpFilename, //接收路径的字符串缓冲区
       _In_      DWORD nSize        //接收路径的字符缓冲区的大小
);

该函数类似Linux下的readlink,也会包含可执行程序名称,需再处理去除

eg:

#include<windows.h>
#include<direct.h>
#include<stdio.h>

int main()
{
    char szBuf[512] = { 0 };
    getcwd(szBuf, sizeof(szBuf)-1);
    printf("buf:%s\n", szBuf);


    char szPath[512] = {0};
    GetModuleFileName(NULL, szPath, sizeof(szPath)-1);
    printf("path:%s\n", szPath);
    getchar();
}

假设生成的可执行程序叫demo.exe,放在:C:\program\test目录,

若是在 C:\program\test执行,输出:

若是在C:\program执行,输出:

 

******2020.7.6 补充******

windows环境,获取调用动态库的所在路径

eg:一个动态库demo.dll,其中封装了获取动态库的函数getPath(),一个可执行程序linkDemo.exe链接该dll,若要获取demo.dll所在路径,需如下实现:

/**demo.dll的内容**/
#include<windows.h>
#include<direct.h>
#include<stdio.h>
#include<tchar.h>
#include"test.h"


int getPath()
{
    char szPath[512] = { 0 };
    GetModuleFileName(NULL, szPath, sizeof(szPath) - 1);
    printf("path:%s\n", szPath);
    return 0;
}
int getLibraryPath()
{

    char szPath[512] = {0};
    HMODULE hMod = GetModuleHandle(_T("demo.dll"));
    GetModuleFileName(hMod, szPath, sizeof(szPath)-1);
    printf("path:%s\n", szPath);
    return 0;
}

调用程序:

#include "test.h"
#include<stdio.h>

int main()
{
    printf("begin....\n");
    getLibraryPath();
    getchar();
}

将linkDemo.exe放置在 C:/program/test,将demo.dll放置在E:/library中,执行可分别获得exe和dll的路径:

你好!对于在Linux上配置C/C++环境并使用VS Code进行开发,你可以按照以下步骤进行操作: 步骤 1:安装GCC和G++编译器 首先,确保你的系统中已经安装了GCC和G++编译器。你可以通过在终端中运行以下命令来检查它们是否已安装: ``` gcc --version g++ --version ``` 如果命令返回了版本信息,则说明已经安装好了。如果没有安装,你可以通过运行以下命令来安装它们: ``` sudo apt-get update sudo apt-get install build-essential ``` 步骤 2:安装VS Code 访问VS Code的官方网站(https://code.visualstudio.com/)并下载适用于Linux的版本。选择合适的包(.deb或.rpm),然后按照安装向导进行安装。 步骤 3:安装C/C++扩展 在VS Code中,点击左侧的扩展图标(四个方块),搜索并选择 "C/C++" 扩展进行安装。 步骤 4:创建C/C++项目 在VS Code中,打开一个文件夹,然后点击菜单栏的 "文件" -> "新建文件夹",为项目创建一个新的文件夹。 步骤 5:配置编译器路径 打开VS Code的设置(快捷键:Ctrl + ,),在搜索框中输入 "C/C++",找到 "C/C++: Edit Configurations (UI)" 选项并点击。在弹出的窗口中,点击 "C++",然后再点击 "g++"。在 "compilerPath" 字段中,填入你的GCC编译器的路径。通常情况下,它应该是 "/usr/bin/g++"。 步骤 6:创建C/C++源文件 在项目文件夹中,右键点击空白处,选择 "新建文件" -> "新建文件"。在文件名后面加上 ".cpp" 后缀,比如 "main.cpp"。然后,在文件中编写你的C/C++代码。 步骤 7:编译和运行 在VS Code中,按下快捷键 "Ctrl + ` " 打开集成终端。在终端中输入以下命令来编译你的代码: ``` g++ -o output_filename source_filename.cpp ``` 将 "output_filename" 替换为你想要的输出文件的名字,将 "source_filename.cpp" 替换为你的源代码文件名。 然后,在终端中运行以下命令来执行你的程序: ``` ./output_filename ``` 这样就可以在终端中看到你的程序的输出了。 希望这些步骤能够帮助你在Linux上配置C/C++环境并使用VS Code进行开发!如果有任何问题,请随时向我提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值