반응형
오늘은 프로그래밍 분야에서 널리 사용되는 강력한 라이브러리인 Boost.Program_options에 대해 알아보겠습니다.
Boost.Program_options은 명령줄 옵션을 파싱하고 처리하는 데 도움이 되는 라이브러리로, C++ 프로그램에서 명령행 인자를 처리하는 과정을 간단하고 효율적으로 만들어줍니다.
간단한 사용법
Boost.Program_options을 이용한 간단한 사용법은 다음과 같습니다.
이 예제에서는 프로그램 실행시 명령줄에서 "--input" 옵션을 통해 입력 파일 이름을 지정하는 경우를 다루겠습니다.
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char* argv[]) {
po::options_description desc("Allowed options");
desc.add_options()
("input", po::value<std::string>(), "Input file name")
("output", po::value<std::string>(), "Output file name")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("input")) {
std::cout << "Input file: " << vm["input"].as<std::string>() << std::endl;
}
return 0;
}
아래는 테스트 결과입니다. 다만 지정하지 않은 옵션이나 help 옵션이 동작하지 않네요.
$ ./example --input xxxx
Input file: xxxx
$ ./example --4444
terminate called after throwing an instance of 'boost::wrapexcept<boost::program_options::unknown_option>'
what(): unrecognised option '--4444'
중지됨 (코어 덤프됨)
$ ./example --help
terminate called after throwing an instance of 'boost::wrapexcept<boost::program_options::unknown_option>'
what(): unrecognised option '--help'
중지됨 (코어 덤프됨)
'--help' 옵션 추가하기
11번, 18번~21번 라인이 추가되었습니다.
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char* argv[]) {
po::options_description desc("Allowed options");
desc.add_options()
("input", po::value<std::string>(), "Input file name")
("output", po::value<std::string>(), "Output file name")
("help", "produce help message") // 추가
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("help")) { // 추가
std::cout << desc << std::endl; // 추가
return 1; // 추가
}
if (vm.count("input")) {
std::cout << "Input file: " << vm["input"].as<std::string>() << std::endl;
}
return 0;
}
이제 --help 옵션이 처리됩니다. 다만 여전히 등록되지 않은 옵션들은 처리되지 않습니다.
$ ./example --help
Allowed options:
--input arg Input file name
--output arg Output file name
--help produce help message
$ ./example --4444
terminate called after throwing an instance of 'boost::wrapexcept<boost::program_options::unknown_option>'
what(): unrecognised option '--4444'
중지됨 (코어 덤프됨)
등록되지 않은 '임의의' 옵션 허용하기
임의의 옵션을 허용하기 위해서는 'parse_command_line' 대신에 'command_line_parser'을 사용해야 합니다.
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char* argv[]) {
po::options_description desc("Allowed options");
desc.add_options()
("input", po::value<std::string>(), "Input file name")
("output", po::value<std::string>(), "Output file name")
("help", "produce help message")
;
po::variables_map vm;
po::parsed_options parsed = po::command_line_parser(argc, argv). // 추가
options(desc). // 추가
allow_unregistered(). // 추가
run(); // 추가
po::store(parsed, vm); // 추가
if (vm.count("help")) {
std::cout << desc << std::endl;
return 1;
}
if (vm.count("input")) {
std::cout << "Input file: " << vm["input"].as<std::string>() << std::endl;
}
return 0;
}
이제 아래와 같이 등록되지 않은 인자도 허용을 합니다. (큰 의미는 없지만요)
$ ./example --help
Allowed options:
--input arg Input file name
--output arg Output file name
--help produce help message
$ ./example --4444
위치기반 옵션 (positional options)
아래와 같은 명령을 수행하면 아무런 메시지가 나오지 않습니다.
그 이유는 kkangeva는 등록되지도 않았고 일반적인 형태도 아니기 때문입니다.
이런 형태의 옵션을 positional options이라고 합니다. 필요하다면 이를 파싱해서 사용해야겠죠.
핵심은 강제로 옵션명을 부여하는 것이 되겠습니다.
$ ./example kkangeva
# 아무런 출력 없음.
코드를 변경해봅니다.
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char* argv[]) {
po::options_description desc("Allowed options");
desc.add_options()
("input", po::value<std::string>(), "Input file name")
("output", po::value<std::string>(), "Output file name")
("name", po::value<std::string>(), "Person's name") // 추가
("help", "produce help message")
;
po::positional_options_description pos; // 추가
pos.add("name", -1); // 추가
po::variables_map vm;
po::parsed_options parsed = po::command_line_parser(argc, argv).
options(desc).
positional(pos). // 추가
allow_unregistered().
run();
po::store(parsed, vm);
if (vm.count("help")) {
std::cout << desc << std::endl;
return 1;
}
if (vm.count("input")) {
std::cout << "Input file: " << vm["input"].as<std::string>() << std::endl;
}
// 아래 추가
if (vm.count("name")) {
std::cout << "Person's name: " << vm["name"].as<std::string>() << std::endl;
}
return 0;
}
아래와 같이 이제 kkangeva가 출력이 됩니다.
$ ./example kkangeva
Person's name: kkangeva
반응형
'소프트웨어 > 리눅스' 카테고리의 다른 글
리눅스 부팅시 특정 서비스 제어하기 (systemd) (0) | 2023.08.27 |
---|---|
리눅스 '정적/동적 라이브러리'의 대해서 (.so, .a, dlopen) (0) | 2023.08.08 |
DAC (Discretionary Access Control)와 관련된 명령어들 (0) | 2023.07.26 |