gpt4 book ai didi

C++ 从相对路径获取模型/资源的绝对路径

转载 作者:行者123 更新时间:2023-11-30 03:37:46 27 4
gpt4 key购买 nike

我正在编写 ML 引擎并进行测试以测试不同的模型。项目结构如下所示:

- src
-- model1.cpp
- test
-- models
--- model1.bin
-- src
--- model1Test.cpp

所以在我的测试文件中我知道相对路径,它是 ../models/model1.bin

我的第一个问题是:如何将它转换为绝对值?

其次。我使用 Clion ide,当你构建项目时,它实际上是在其他地方构建它,而不是源所在的位置(例如 /home/uuser1/.clion/cache/bla/bla/调试/)。而且它不会将模型复制到该文件夹​​。因此,当我使用 boost::filesystem::absolute(relative) 时,它会返回执行点的路径,而不是源路径。如何处理?

最佳答案

您回答自己的第一个问题,使用 boost::filesystem::absolute从相对路径获取绝对路径。您还可以查看 boost::filesystem::canonical 删除符号链接(symbolic link)和特殊符号(., ..)。

路径将始终相对于可执行文件的运行位置,即当前工作目录,而不是可执行文件的路径。只有一种方法可以始终如一地解决此问题:不要在代码中使用相对路径。

一个简单的解决方案是将目录路径作为命令行参数传递。之前在 SO Docs 上的以下描述使这很容易。


Boost 程序选项提供了一种简单而安全的方法来解析和处理命令行参数。

#include <boost/program_options.hpp>
#include <string>
#include <iostream>

int main(int argc, char** argv) {
namespace po = boost::program_options;

po::variables_map vm;
po::options_description desc("Allowed Options");

// declare arguments
desc.add_options()
("name", po::value<std::string>()->required(), "Type your name to be greeted!");

// parse arguments and save them in the variable map (vm)
po::store(po::parse_command_line(argc, argv, desc), vm);

std::cout << "Hello " << vm["name"].as<std::string>() << std::endl;

return 0;
}

编译并运行:

 $ g++ main.cpp -lboost_program_options && ./a.out --name Batman
Hello Batman

您可以输出一个 boost::program_options::options_description 对象来打印预期的参数格式:

std::cout << desc << std::endl;

会产生:

Allowed Options:
--name arg Type your name to be greeted!

要快速了解 CLion,可以使用 to set the working directory of your run通过 Run -> Edit Configurations,但我强烈建议您选择更永久和可靠的解决方案。

关于C++ 从相对路径获取模型/资源的绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40044215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com