【问题标题】:Determine path to executable using c++ [duplicate]使用c ++确定可执行文件的路径[重复]
【发布时间】:2013-04-03 19:23:34
【问题描述】:

我正在使用 C++、flex 和 GNU bison 编写一个简单的语言解释器/翻译器。我需要知道可执行文件的路径。对于诸如“mylang mysource.ext”之类的简单情况,我可以使用argcargv 获取路径,但是如果通过shebang 调用文件我该怎么办(例如“#/usr/bin/env mylang”) ?

在其他情况下,argcargv 组合不起作用。是否有可能覆盖这种情况?如果是这样,我想获得可执行文件的完整路径。解决方案必须是跨平台的。如果可能的话,我想避免使用外部库,尤其是 boost,这对我的目标来说非常大。谢谢!

【问题讨论】:

  • 在 Windows 上,GetModuleFileName(NULL, ...)。 (我怀疑你会找到一个跨平台的答案。)
  • 您在使用argv[0] 时遇到了哪些具体问题?你的目标是什么平台?
  • 同样的主题出现了yesterday。通常的解决方案包括 argv[0] (Linux) 或 GetModuleFileName() (Windows)。建议:为什么不要求用户定义一个指向您的根目录的 $ENVIRONMENT 变量?
  • 关于 shebang 的部分(例如“#/usr/bin/env mylang”) 恕我直言,是对 linux 的提示。

标签: c++ path executable


【解决方案1】:

这将非常依赖于平台,但对于 linux,符号链接“/proc/self/exe”指向当前映像的物理路径。从这里,您可以使用 readlink 来确定路径。我最近用过这个:

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string>
#include <stdexcept>
#include <boost/scoped_array.hpp>

std::string path;

size_t size = 1024;
const ssize_t err = static_cast<ssize_t>(-1);
while (true)
{
    boost::scoped_array<char> buffer(new char[size]);

    ssize_t res = readlink("/proc/self/exe", buffer.get(), size);

    if (res == err)
    {
        if (errno == ENAMETOOLONG)
            size *= 2; // try again
        else
            throw std::runtime_error("unexpected error during readlink");
    }
    else
    {
        path.assign(buffer.get(), res);
        break;
    }
}

这是使用 G++ 4.1.2 完成的,因此没有可用的 unique_ptr,也可以轻松删除对 boost::scoped_array 的引用。

注意:这为您提供了当前图像的完整路径,而不是图像所在的目录。要获取目录,您需要进行一些操作。 Boost Filesystem 也有一些很好的功能来做到这一点。否则,你将不得不自己去解析它。

此外,如果您是库,并且不能依赖另一部分代码更改当前工作目录,或者无权访问argv,则上述方法非常有用。 getcwd + argv[0] 可以正常工作当且仅当您可以保证您的应用程序或库中的任何内容都不会从您下方更改当前工作目录 (CWD)。 argv[0] 仅在 CWD 未更改时有效。

此外,如果可执行文件是通过环境变量查找(例如 $PATH)定位的,则您需要实现路径解析才能找到您的真实位置。 argv[0] 仅返回您的启动方式。即,如果您运行命令“ls -al”,argv[0] 到命令“ls”将只是“ls”。如果您运行“/usr/bin/ls -al”,argv[0] 将是“/usr/bin/ls”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 2019-09-22
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2016-09-15
    • 2012-11-20
    • 2010-12-12
    相关资源
    最近更新 更多