在写命令行程序的时候经常需要解析各种命令行参数、打印help信息等,觉得非常的麻烦。今天介绍一种超级棒的命令参数解析的方法:居于LLVM 的命令行参数解析,有了它妈妈再也不用担心我不会解析命令行参数^ _ ^。
一、工程目录结构
二、示例代码
2.1 CMDemo.cpp
1.#include
2.#include
3.#include
4.#include
5.using namespace llvm;
6.
7.static cl::opt<bool> BOOLEAN_ARG("boolean-arg",cl::desc("test boolean arg"),cl::init(false));
8.static cl::opt<int> INT_ARG("int-arg",cl::desc("test integer arg"),cl::init(0));
9.static cl::opt<std::string> STRING_ARG("string-arg",cl::desc("string arg"),cl::value_desc("test string arg"),cl::init(""));
10.
11.int main(int argc, char **argv){
12.
13. cl::ParseCommandLineOptions(argc,argv,"llvm CommandLine demo\n");
14.
15. std::string string_arg = STRING_ARG;
16. bool boolean_arg = BOOLEAN_ARG;
17. int int_arg = INT_ARG;
18.
19. printf("string_arg:%s \n",string_arg.c_str());
20. printf("boolean_arg:%d \n",boolean_arg);
21. printf("int_arg:%d\n",int_arg);
22. return 0;
23.}
2.2 CMakeLists.txt
1.cmake_minimum_required(VERSION 3.11.2) #cmake版本要求
2.
3.project(CMDemo) #项目名称
4.
5.link_libraries(z)
6.link_libraries(curses)
7.link_libraries(pthread)
8.
9.set(CMAKE_CXX_STANDARD 11) #设置C++标准为C++11 LLVM 10 之后要用C++14
10.
11.set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) #设置库文件输出到代码源路径下的lib文件夹中;
12.
13.find_package(LLVM REQUIRED CONFIG) #找到LLVM库,REQUIRED表示一定要找到这个库,找不到这个库,编译就直接结束,不再往下进行了
14.
15.llvm_map_components_to_libnames(LLVM_LIBRARIES all) #获取所有的LLVM库名称列表 保存在LLVM_LIBRARIES变量中
16.include_directories(${LLVM_INCLUDE_DIRS}) #设置LLVM库的头文件路径
17.
18.add_compile_options(-fno-rtti) #不用C++ RTTI 不然链接的时候会报错
19.
20.include_directories(${PROJECT_SOURCE_DIR}/include) #设置工程头文件路径
21.
22.
23.add_executable(CMDemo src/CMDemo.cpp)
24.
25.target_link_libraries(CMDemo ${LLVM_LIBRARIES}) #添加依赖库
三、运行效果
3.1 使用帮助
3.2 默认参数
3.3 传递参数
四、总结
主要是调用了LLVM Support库的cl::ParseCommandLineOptions函数对命令行参数进行解析,一行代码就完成了命令行参数解析功能。