我试图在 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/