码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【gflags】【gflags实践】【gflags的学习使用记录】


    【gflags】【gflags实践】【gflags的学习使用记录】

    • 0 前言
    • 1 gflags介绍
    • 2 gflags安装
    • 3 gfalgs使用
      • 3.1 CMakeLists.txt
      • 3.2 头文件
      • 3.3 使用
        • 3.3.1 使用案例一,slam十四讲的cmake使用
          • 3.3.1.1 案例代码
          • 3.3.1.2 使用说明
            • 3.3.1.2.1 使用前定义要使用的参数
            • 3.3.1.2.2 参数的使用
            • 3.3.1.2.3 必要的初始化
            • 3.3.1.2.4 `DECLARE_XXX`的使用
            • 3.3.1.2.4 执行可执行文件常用的特殊flag
        • 3.3.2 使用案例二,简单c++编译
          • 3.3.2.1 案例代码
          • 3.3.2.2 编译方式
        • 3.3.3 使用案例三,运行可执行文件的参数设置
          • 3.3.3.1 案例代码
          • 3.3.3.2 编译方式
          • 3.3.3.3 运行方式
            • 3.3.3.3.1 无参数
            • 3.3.3.3.2 指定单个参数
            • 3.3.3.3.3 指定多个参数
        • 3.3.4 使用案例四,配置gflags文件
          • 3.3.4.1 案例代码
            • 3.3.4.1.1 专门定义gflags的头文件`gflags_def.cpp`
            • 3.3.4.1.2 主文件的`DECLARE_`声明
          • 3.3.4.2 编译方式
          • 3.3.4.3 运行
            • 3.3.4.3.1 配置`.gflags`文件
            • 3.3.4.3.2 运行
              • 3.3.4.3.2.1 不指定gflags配置文件
              • 3.3.4.3.2.2 指定gflags配置文件
              • 3.3.4.3.2.3 测试修改`.gfalgs`演示
    • 4 参考

    0 前言

    1 gflags介绍

    • gflags是google开源的一套命令行参数解析工具。通常在项目开发中会有一种需求:
    1. 可以在代码运行的时候指定某些代码中某些参数的值
    2. 如果没有显式指定,这些参数可以使用默认的值
    3. 在工程实践中,有专门定义gflags的文件,通过–flagfile=filename来指定gflags配置文件,其他文件在使用gflags时需要先声明;通常将gflags定义在专门的配置文件中,以方便对程序运行参数管理。
    • Github上的gflags项目:https://github.com/gflags/gflags

    2 gflags安装

    参考:【多传感器融合定位】【ubuntu18.06配置环境】【ROS melodic】【g2o】【ceres】【Geographic】【gflags】【glog】【sophus】【GTSAM】【gtest】

    3 gfalgs使用

    3.1 CMakeLists.txt

    # gflags
    find_package(GFlags REQUIRED)
    include_directories(${GFLAGS_INCLUDE_DIRS})
    
    add_executable(xxx xxx.cpp)
    target_link_libraries(xxx  ${GFLAGS_LIBRARIES})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2 头文件

    #include 
    
    • 1

    3.3 使用

    3.3.1 使用案例一,slam十四讲的cmake使用

    3.3.1.1 案例代码

    参考:【slam十四讲第二版】【课本例题代码向】【第十三讲~实践:设计SLAM系统】的3.2.1 run_kitti_stereo.cpp

    //
    // Created by gaoxiang on 19-5-4.
    //
    
    #include 
    #include "myslam/visual_odometry.h"
    
    DEFINE_string(config_file, "./config/default.yaml", "config file path");
    
    int main(int argc, char **argv) {
    
        // 解析gflags参数,只需要1行代码
        google::ParseCommandLineFlags(&argc, &argv, true);
        //gflags::ParseCommandLineFlags(&argc, &argv, true);
        myslam::VisualOdometry::Ptr vo(
            new myslam::VisualOdometry(FLAGS_config_file));
        //assert(vo->Init() == true);//注释去这句话my_czy
        vo->Init();
        vo->Run();
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.3.1.2 使用说明

    3.3.1.2.1 使用前定义要使用的参数
    • 如DEFINE_string(config_file, "./config/default.yaml", "config file path");,这个宏的三个参数分别是:
    1. 参数config_file:参数名
    2. 参数"./config/default.yaml":参数的默认值
    3. 参数 "config file path":参数的说明
    • gflags支持以下参数类型
    1. DEFINE_bool: bool
    2. DEFINE_int32: 32-bit integer
    3. DEFINE_int64: 64-bit integer
    4. DEFINE_uint64: unsigned 64-bit integer
    5. DEFINE_double: double
    6. DEFINE_string: C++ string
    3.3.1.2.2 参数的使用
    • 使用参数要在参数名前加上FLAG_
    • 例如前面代码中的FLAGS_config_file
    3.3.1.2.3 必要的初始化
    • 在main函数开始时要初始化flags
    • 例如前面代码中google::ParseCommandLineFlags(&argc, &argv, true);
    3.3.1.2.4 DECLARE_XXX的使用
    • 参考3.3.4.1.2 主文件的DECLARE_声明
    3.3.1.2.4 执行可执行文件常用的特殊flag
    • --help 显示所有文件的所有flag,按文件、名称排序,显示flag名、默认值和帮助

    • --helpshort 只显示执行文件中包含的flag,通常是 main() 所在文件

    • --version 打印执行文件的版本信息

    3.3.2 使用案例二,简单c++编译

    摘自:gflags简明使用指南

    3.3.2.1 案例代码

    //test2.cc
    #include 
    #include 
    #include  //gflags库的头文件
    //else header file
    
    #define LOG
    
    DEFINE_string(ip, "127.0.0.1", "IP address");
    DEFINE_int32(port, 8080, "port");
    
    class Server{
    public:
      Server(const std::string& ip, uint16_t port) : _ip(ip), _port(port) {
        std::cout << "Init Server..." << std::endl;
    #ifdef LOG 
        std::cout << "ip  : " << _ip << std::endl;
        std::cout << "port: " << _port << std::endl;
    #endif
        std::cout << "Init OK!" << std::endl;
      }
      //else code
    private:
      std::string _ip;
      uint16_t _port;
      //else code
    };
    
    
    int main(int argc, char* argv[]) {
      gflags::ParseCommandLineFlags(&argc, &argv, true);  
      Server* pserver = new Server(FLAGS_ip, FLAGS_port);
    
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    3.3.2.2 编译方式

    g++ test2.cc -o test2 -lgflags -lpthread
    
    • 1
    • 在编译的时候要加上-lgflags和-lpthread,因为gflags内部是需要POSIX线程库支持的,所以还需要加上-lpthread。
    • 除了这两个外,也需要指定你安装的gflags的库文件(gcc选项:-L)和头文件(gcc选项:-I)。由于我把这两个放到了系统默认寻找的路径,所以在编译的时候没有显式指定。

    3.3.3 使用案例三,运行可执行文件的参数设置

    • 摘自:后端系统开发利器,gflags概述

    3.3.3.1 案例代码

    • simple_gflags.cpp
    #include 
    #include "gflags/gflags.h"  
     
    // 定义gflags
    DEFINE_bool(foo, false, "a simple gflags named foo, default value is flase, wuruilong, 2018-08-16");
    DEFINE_int32(thread_num, 10, "thread number, default value is 10, wuruilong, 2018-08-16");
     
    int main(int argc, char **argv) {
      // 解析gflags参数,只需要1行代码
      google::ParseCommandLineFlags(&argc, &argv, true);
     
      // 使用gflags
      if (FLAGS_foo) {
        std::cout << "foo is true" << std::endl;
      } else {
        std::cout << "foo is false" << std::endl;
      }
     
      // 使用gflags
      int thread_num = FLAGS_thread_num;
      std::cout << "thread number:" << thread_num << std::endl;
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.3.3.2 编译方式

    g++ simple_gflags.cpp -I./gflags-2.0/src -L./ -lgflags
    
    • 1

    3.3.3.3 运行方式

    3.3.3.3.1 无参数
    ./a.out
    
    • 1

    输出:

    foo is false
    thread number:10
    
    • 1
    • 2
    3.3.3.3.2 指定单个参数
    ./a.out -foo=true
    
    • 1

    输出:

    foo is true
    thread number:10
    
    • 1
    • 2
    3.3.3.3.3 指定多个参数
    ./a.out -foo=true -thread_num=99
    
    • 1

    输出:

    foo is true
    thread number:99
    
    • 1
    • 2

    3.3.4 使用案例四,配置gflags文件

    • 摘自:后端系统开发利器,gflags概述

    3.3.4.1 案例代码

    • 下面是工程实践中使用gflags的例子,新开发的功能用bool类型的gflags包住,新旧代码互不干扰,在gflags开关没有打开时,就好像没有这段代码一样。从这个例子中可以看到gflags在多人开发模式中也能发挥很大的作用。
    3.3.4.1.1 专门定义gflags的头文件gflags_def.cpp
    #include "gflags/gflags.h"
     
    // 定义gflags
    DEFINE_bool(add_new_feature_x, false, "x feature, gaojingying, 2018-08-16");
    DEFINE_bool(add_new_featrue_y, false, "y feature, xiechao, 2018-08-16");
    DEFINE_bool(fix_memory_leak_bug, false, "fix memory leak bug, xiechao, 2018-08-16");
    DEFINE_bool(fix_cpu_high_bug, false, "fix cpu high bug, xiechao, 2018-08-16");
    DEFINE_int32(thread_pool_worker_num, 10, "thread pool worker number, default value is 10, ligang, 2018-08-16");
    DEFINE_string(server_ip, "127.0.0.1", "x server's ip address, gaojingying, 2018-08-16");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3.3.4.1.2 主文件的DECLARE_声明
    • 其他文件中使用gflags之前,需要先通过DECLARE_声明。
    • main.cpp
    #include 
    #include 
    #include 
    #include "gflags/gflags.h"
     
    // 声明gflags
    DECLARE_bool(add_new_feature_x);
    DECLARE_bool(add_new_featrue_y);
    DECLARE_bool(fix_memory_leak_bug);
    DECLARE_bool(fix_cpu_high_bug);
    DECLARE_int32(thread_pool_worker_num);
    DECLARE_string(server_ip);
     
    void Work(std::string &name) {
      name = "feature";
      // 启用x功能
      if (FLAGS_add_new_feature_x) {
        name += "_x";
      }
     
      // 启用y功能
      if (FLAGS_add_new_featrue_y) {
        name += "_y";
      }
     
      char *value = new char[100];
      snprintf(value, 100, "thread number: %d", FLAGS_thread_pool_worker_num);
      name = name + "," + value + "," + FLAGS_server_ip;
     
      // 留下消缺记录
      if (FLAGS_fix_memory_leak_bug) {
        delete []value;
      }
    }
     
    int main(int argc, char **argv) {
      google::ParseCommandLineFlags(&argc, &argv, true);
     
      std::string name;
      Work(name);
      std::cout << name << std::endl;
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    3.3.4.2 编译方式

    g++ main.cpp gflags_def.cpp –I./gflags-2.0/src -L./ -lgflags
    
    • 1

    3.3.4.3 运行

    3.3.4.3.1 配置.gflags文件
    • gflags配置文件demo_project.gflags
    -add_new_feature_x=false
    -add_new_featrue_y=true
    -fix_memory_leak_bug=true
    -fix_cpu_high_bug=false
    -thread_pool_worker_num=20
    -server_ip="127.0.0.1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.3.4.3.2 运行
    3.3.4.3.2.1 不指定gflags配置文件
    ./a.out
    
    • 1

    输出:

    feature,thread number: 10,127.0.0.1
    
    • 1
    3.3.4.3.2.2 指定gflags配置文件
    ./a.out --flagfile=demo_project.gflags
    
    • 1

    输出:

    feature_x,thread number: 20,"127.0.0.1"
    
    • 1
    3.3.4.3.2.3 测试修改.gfalgs演示
    • 修改demo_project.gflags,关闭feature_x功能,启用feature_y功能:
    ./a.out --flagfile=demo_project.gflags
    
    • 1

    输出:

    feature_y,thread number: 20,"127.0.0.1"
    
    • 1

    4 参考

    1. gflags简明使用指南
    2. 【多传感器融合定位】【ubuntu18.06配置环境】【ROS melodic】【g2o】【ceres】【Geographic】【gflags】【glog】【sophus】【GTSAM】【gtest】
    3. 后端系统开发利器,gflags概述
  • 相关阅读:
    11、Service访问Pod、Service IP原理、DNS访问Service、外部访问service
    部署 EMQX 的集群服务
    Switch case 使用及嵌套语法
    【ELK01】ELK简介以及ElasticSearch安装、ES客户端工具-Head安装、报错问题整理
    力扣111 9.6
    计算机图形学、贝塞尔曲线及绘制方法、反走样问题的解决(附完整代码)
    devDept Eyeshot 2022.2 -22年收官版 Eyeshot Fem Edition
    perl列表创建、追加、删除
    SPI在Java中的实现与应用 | 京东物流技术团队
    基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案
  • 原文地址:https://blog.csdn.net/qq_45954434/article/details/126343147
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号