Вы отвечаете на свой первый вопрос, используйте 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;
}
Compile и работать с:
$ 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
, хотя я настоятельно рекомендую вам перейти на более постоянное надежное решение &.