嘿,伙计们,我开始学C++了,有一件事我不明白--我的实际道路是什么?
因此,例如,在Python中,xyz.py的实际路径是我运行python3 xyz.py的地方。但是,它在C++中是如何工作的?
我的C++项目如下所示:
--build
--data
--exampleData
--src
--example1
--include
--src
-FileToRun.cc我将我的项目"example1“构建到build目录。在我的项目中,我想打开exampleData,它的相对路径是什么?它与FileToRun.cc的位置有关吗?还是它取决于我如何执行它,就像在Python中一样?还是别的什么?
发布于 2021-08-25 01:18:17
相对路径相对于调用进程的当前工作目录,无论该路径在使用时位于何处。工作目录可以由父进程指定。或在当前进程的生存期内动态更改。因此,您不能真正依赖于工作目录在任何给定时刻都是您所期望的位置。
您的C++应用程序的默认工作目录可能是您的build文件夹,这取决于您的配置,但它肯定不是您的src文件夹,除非您以这种方式显式设置它(例如,打开一个终端到src文件夹,然后运行可执行文件而不更改文件夹)。或创建可执行文件的快捷方式,并在快捷方式的属性中设置工作目录)。
这在PythonandC++和任何其他语言中都是一样的,因为它是操作系统的特性,而不是应用程序。
如果要确保相对路径相对于可执行文件(或任何其他根),则应在运行时将它们转换为绝对路径。检索可执行文件的绝对文件夹路径(例如在Windows上使用GetModuleFileName()或main()中的argv[0]等,然后删除可执行文件的文件名),或者任何您想要的绝对根。然后附加你的相对路径。然后根据需要解析任何剩余的./..。
因此,例如,如果您有<path>/build/example1.exe并且希望访问<path>/data/exampleData,那么您可以
<path>/build/example1.exe开始<path>/build/../data/exampleData以获取<path>/build/../data/exampleData/build/../data/解析为/data/<path>/data/exampleData有一些API可以帮助完成这一任务。例如Windows上的PathCombine()/PathAppend()/PathCanonicalize()和PathRemoveFileSpec()。或者图书馆 in C++17。
发布于 2021-08-25 01:49:12
我想你是在问什么是current working directory。( CWD)在运行可执行文件时,如何访问位于某个目录中的数据。
这取决于您如何运行可执行文件。
build目录很可能是CWD,因为VS倾向于将输出目录设置为CWD。在这种情况下,我建议您检查项目设置,因为我刚才说的在IDE中完全可以自定义。如果在设置中将build设置为CWD,则可以通过../data/exampleData/<your file>访问数据。虽然您可以在IDE中设置#2的CWD,但是在释放可执行文件之后,您可能会发现很难找到包含数据的目录。(也就是说,您将其构建为发布版本以发布它),因为由于#1中所描述的原因,相对路径可能会根据运行可执行文件的位置而改变。因此,我建议您解决这个问题,就是通过显式调用程序中的系统函数,将可执行文件所在的目录设置为CWD,从而使您的可执行文件能够始终找到您的资产,无论您如何运行它。
https://stackoverflow.com/questions/68915589
复制相似问题