c++ - 获取运行文件名:argv[0] vs boost::filesystem::current_path()

标签 c++ boost

我试图在 C++ 中获取当前运行的文件名。我写了一个简单的代码,它同时使用了 argv[0] 和 boost current_path() 方法。该文件被编译成可执行文件mainWindow。

#include "boost/filesystem.hpp"

int main(int argc, char* argv[])
{
    boost::filesystem::path full_path( boost::filesystem::current_path() );
    std::cout << full_path.string() << "\n";

    std::cout << argv[0] << "\n\n";

    return 0;
} 

有趣的是每种方法的输出是不同的。

argv[0] 输出为:

../VENTOS/src/loggingWindow/mainWindow

current_path() 输出是:

/home/mani/Desktop/VENTOS_Redpine

我没有直接从终端运行我的程序 (mainWindow)。另一个应用程序正在调用我的程序,我想这就是输出不同的原因。我说得对吗?

我的第二个问题是:如果不使用 argv[0] 选项并且仅依赖于 boost 文件系统方法,我如何才能获得与 argv[0] 相同的结果?

最佳答案

argv[0] 仅包含用于执行程序的命令。这可能包含路径。它可能包含一个相对路径。它可能根本不包含任何路径。由于符号链接(symbolic link)等原因,它甚至可能不包含可执行文件名称……如果托管系统选择不提供任何内容,它甚至可能是空的。它不可信,因此您不想以此作为评估其他方法的基础。

boost::filesystem::current_path 使您失败,因为它只返回当前工作目录。这可能是也可能不是可执行文件的位置,因为它取决于程序运行的目录以及工作目录是否已被程序更改。老实说,我不确定是否有可靠的方法从 Boost 获取进程名称和路径。几年前还没有,但时间会继续前进,你知道吗?

有很多问题涉及如何获取可执行文件和路径(Finding current executable's path without /proc/self/exe 看起来很有前途,但已经过时了。那时候又开始了。)但所有问题都是特定于平台的,您可能需要做一些 ifdef 或链接器魔法来完成这项工作。

关于c++ - 获取运行文件名:argv[0] vs boost::filesystem::current_path(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421088/

相关文章:

c# - 在 Visual Studio Express 2015 中的同一个项目中混合使用 c++ 和 c#

c++ - 仅使用数组的一部分

c++ - 两个 cin/cout 语句合并为一个

c++ - 哪个是将原始指针(由用户提供)保存到 shared_ptr 的更好接口(interface)

c++ - boost graph adjacency_list,检索节点的父节点

c++ - 如何使用 3d 的 max 2016 SDK (C++) 在插件中添加保存文件对话框?

c++ - printf 语句中的 "%3d"是什么意思?

c++ - Boost库中用于动态位集的硬件支持的popcount

c++ - 改变线程任务?

c++ - 如何在boost::grid_graph中使用给定的vertex_descriptor访问edge_descriptor