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

时间:2016-10-14 13:19:25

标签: c++ boost path filepath clion

我写了ML引擎,并测试了不同的模型。项目结构如下:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

一个简单的解决方案是将路径作为命令行参数传递给目录。之前在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,但我强烈建议你选择更永久的&amp;可靠的解决方案。