使用c++确定可执行文件的路径
Determine path to executable using c++
我正在用c++、flex和GNU bison编写一个简单的语言解释器/翻译器。我需要知道可执行文件的路径。对于简单的情况,如"mylang mysource. exe"。"我可以使用argc
和argv
获得路径,但是如果通过shebang调用该文件,我该怎么办?"#/usr/bin/env mylang")?
还有其他argc
和argv
组合不起作用的情况。有可能克服这种情况吗?如果是这样,我想要得到可执行文件的完整路径。解决方案必须是跨平台的。如果可能的话,我希望避免使用外部库,尤其是boost,它对我的目标来说太大了。谢谢!
这将非常依赖于平台,但对于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"。
- 获取自己的可执行文件的当前路径 (C++)
- 运行可执行文件时找不到共享库,即使共享库存在于指定的路径中
- 在可执行文件中使用带有符号链接的相对路径
- C 检索可执行文件的图标,用于Windows注册表图标路径
- 如何从Windows中的可执行文件中推断出文件/目录路径
- 在英特尔C++编译器 (Linux) 的配置搜索路径中找不到文件可执行文件
- C++通过windows搜索路径查找可执行文件
- 在 Visual C++ 系统调用的路径中找不到可执行文件
- 使用 php 将带有命令行可执行文件路径的参数传递
- C++ WinAPI - 如何从可执行文件的名称中获取其安装路径
- 当路径中有空格时,从与Qt应用程序相同的目录启动可执行文件
- 通过路径获取 Windows 可执行文件的显示名称
- 是否有方法将相对库路径添加到可执行文件以避免设置LD_library_path
- 从Makefile中的c可执行文件中删除硬编码的路径
- 从c++中获取python可执行文件的完整路径
- 如何从Visual c++中获取特定的windows服务可执行文件路径
- 用静态库的完整路径链接可执行文件
- 使用c++确定可执行文件的路径
- Eclipse c++调试可执行文件没有找到具有相对路径的文件
- 找到可执行文件的绝对路径,可以从CMD运行