如何获取 c++ 文件的当前工作目录

How to get current working directory of a c++ file

本文关键字:文件 当前工作 c++ 何获取 获取      更新时间:2023-10-16

我使用以下代码获取C++文件的当前工作目录

//Getting current working directory
getcwd( wd, 1024 );
std::string cwd = wd;

如果此文件中的函数是从另一个函数调用的,则当前工作目录将成为调用函数的路径。

如何获取原始文件/二进制文件所在的当前目录?

我正在添加细节,因为这个问题令人困惑。

我创建了一个从Scilab调用的.so文件。如果我使用 readlink(),我会得到要/usr/bin/scilab-bin的路径,这不是我想要的。如何获取当前函数所在的 so 文件的路径?

这个问题几乎是 如何检查在运行时为给定进程加载了哪些共享库?的重复。您需要的信息只能从/proc 文件系统获得,告诉您哪些文件已动态映射到进程中的内存中。

你在评论中提到了.so文件,所以我假设你的目标是GNU/Linux。 您可以使用 dladdr1 函数获取包含地址的.so文件的路径名,如下所示:

#include <string>
#include <vector>
#include <dlfcn.h>
#include <libgen.h>
#include <link.h>
#include <string.h>
static std::string
get_path ()
{
  Dl_info info;
  void *extra_info;
  if (dladdr1 (reinterpret_cast <void *> (&get_path),
               &info, &extra_info, RTLD_DL_LINKMAP) == 0)
    // Some form of error handling.
    return "";
  link_map *lm = static_cast<link_map *> (extra_info);
  // Make a copy of l_name because dirname modifies its argument.
  std::vector<char> buffer (lm->l_name, lm->l_name + strlen (lm->l_name) + 1);
  return dirname (buffer.data ());
}

dladdr1的第一个参数非常随意,但最好不要使用从 DSO 导出的符号,因为它最终可能会引用不同对象中的某些内容(由于 PLT 存根和副本重定位)。