1. 引言

SLAM开发过程中常会用到gflags, glog, gtest 这三件套,gflags 是参数管理工具,glog 是日志打印工具,而 gtest是单元测试工具,下面对其进行学习和初步使用。

2. gflags

直观的理解,就是对命令行参数中的flag进行管理的一个库,比如ls -l中的-l就是一个flag,后面没有跟参数。这就是最初步的理解。

先挖个坑,到时候来填:
参考1
参考2

安装:

git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=gflags ../
make -j4
sudo make install

注意上面要设置为默认生成动态库,下面会讲到。

工程/foo.cpp:

#include <iostream>
#include <gflags/gflags.h>using namespace std;//宏定义gflags
DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
DEFINE_string(languages, "english,french,german", "comma-separated list of languages to offer in the 'lang' menu");
DEFINE_int32(tmp, 100, "This is temp test value!");static bool ValidatePort(const char* flagname, int value) {if (value > 0 && value < 32768)   // value is okreturn true;printf("Invalid value for --%s: %d\n", flagname, (int)value);return false;
}int main(int argc, char** argv)
{DEFINE_validator(tmp, &ValidatePort);if(tmp_validator_registered){cout<<"tmp 定义成功"<<endl;cout<<"tmp值为:"<<FLAGS_tmp<<endl;cout<<"请输入要修改的tmp值:";cin>>FLAGS_tmp;cout<<endl<<"修改成功,修改后tmp为:"<<FLAGS_tmp<<endl;}else cout<<"tmp 定义失败"<<endl;return 0;
}

工程/CMakeLists.txt:

PROJECT(GFLAGS_)
FIND_PACKAGE(gflags REQUIRED)IF (GFLAGS_INCLUDE_DIR)
MESSAGE(INFO "找到了gflags库")
ENDIF (GFLAGS_INCLUDE_DIR)ADD_EXECUTABLE(foo foo.cpp)
TARGET_LINK_LIBRARIES(foo gflags)   #这里不是gflags::gflags,找不到

访问定义的FLAGS就直接可以当作正常的变量访问,只是需要加前缀FLAGS_,如上面定义的tmp变量,访问可以直接FLAGS_tmp:

多文件使用FLAGS需要声明,在hello.h文件中声明,然后直接#include "hello.h"就可以直接使用这个FLAGS了

ADD_EXECUTABLE(sayhello useHello.cpp)
INCLUDE_DIRECTORIES(../include)  #添加一个头文件搜索路径
FIND_PACKAGE(gflags REQUIRED)
TARGET_LINK_LIBRARIES(sayhello hello gflags)  #最最最重要的事情:千万不要忘记把所有的库都link到sayhello上

强调一定要把所有的库都link到sayhello上。

#pragma once
#include <gflags/gflags.h>
DECLARE_int32(tmp);  //声明FLAGS
void sayHello();

直接使用flags即可,因为是默认安装到usr/local/下的,所以也不用SET(PACKAGE_DIR)FIND_PACKAGE(gflags)

main

#include <iostream>
#include "hello.h"
#include <gflags/gflags.h>DEFINE_int32(print_times, 1, "The print times");int main( int argc, char** argv )
{gflags::ParseCommandLineFlags(&argc, &argv, true);  //用于接受命令行的flag参数并更新默认参数for(int i=FLAGS_print_times; i>0;--i)sayHello();std::cout<<"FLAGS_tmp的值为:"<<FLAGS_tmp<<std::endl;return 0;
}

gflags::ParseCommandLineFlags(&argc, &argv, true); 用于接受命令行的flag参数并更新默认参数

./sayhello -print_times 10

传入参数

3.glog

先装gflags,再装glog
但是在装glog时会出现编译动态库时不能使用静态库,

/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: 最后的链结失败: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/glog.dir/build.make:84:libglog.so.0.6.0] 错误 1
make[1]: *** [CMakeFiles/Makefile2:1102:CMakeFiles/glog.dir/all] 错误 2
make: *** [Makefile:163:all] 错误 2

所以gflags要安装动态库.so,所以前面安装时设置了DBUILD_SHARED_LIBS=ON

cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=gflags ../

看了半天,没发现这个glog的优势在哪,除了一些判断语句的输出,为什么不直接用cout??
先放着。

4. gtest

有tests,test suits, test programs

1.Assertions

ASSERT*EXPECT*类的函数,前者如果断言错误则直接中止程序,后者不会,更倾向于后者,很严重的断言采用ASSERT*

test/CMakeLists.txt为:

INCLUDE_DIRECTORIES(../include)  #hello.h搜索路径
FIND_PACKAGE(gflags REQUIRED)  #找到gflags包
FIND_PACKAGE(glog REQUIRED)    #找到glog包set(CMAKE_CXX_STANDARD 11)
include(FetchContent)  #载入模块
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)#后面又添加的
enable_testing()
add_executable(  main_test  main_test.cpp)
target_link_libraries(main_test  gtest_main hello gflags glog)#使CMake runner能够在二进制中找到测试,使用GoogleTest模块
include(GoogleTest)  #用来载入 CMakeLists.txt 文件,也用于载入预定义的 cmake 模块. INCLUDE(file1 [OPTIONAL])  INCLUDE(module [OPTIONAL])
gtest_discover_tests(main_test)

test/main_test.cpp为:

#include <gtest/gtest.h>
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <hello.h>TEST(FactorialTest, ZeroInput){EXPECT_EQ(my_fac(0), 1);
}
TEST(FactorialTest, PositiveInput){EXPECT_EQ(my_fac(1), 1);EXPECT_EQ(my_fac(2), 2);EXPECT_EQ(my_fac(3), 6);
}

gflags,glog,gtest学习相关推荐

  1. GTest学习笔记(一)

    GTest学习笔记(一) 环境准备:CMake+Visual Studio 原博客: (20条消息) 记gtest1.10.0安装过程及简单使用_wingrez的博客-CSDN博客 使用GTest搭建 ...

  2. Ubuntu 16.04 系统 gflags glog 安装

    系统环境 Ubuntu 16.04 GCC 5.4 安装步骤 安装 GFlags 运行如下指令: git clone https://github.com/gflags/gflags.git cd g ...

  3. gtest 学习之五 测试用例中定义类

    上一个例子中被测试的类是作为测试类的一个成员变量,在本例中没有测试类,被测试类只能在一个测试用例中定义使用 头文件sample4.h #ifndef GTEST_SAMPLES_SAMPLE4_H_ ...

  4. gtest学习笔记--2测试夹具(类)TEST_F

    相关的配置与参考可以看相同系列的第一篇.本篇只提供代码. test_02.h #ifndef GTEST_SAMPLES_SAMPLE3_INL_H_ #define GTEST_SAMPLES_SA ...

  5. apollo如何添加第三方库,以pylon为例

    1.在apollo/third_party/ 里面增加pylon文件夹 workspace.bazel """Loads the OpenCV library" ...

  6. facebook surround360 环境配置,编译,测试(生成双目立体全景图)

    surround360是facebook开源的一套集采集,渲染与一体的全景内容制作解决方案,其中使用到了诸多开源库,花了几天时间才把它跑通,下面就记录一下其中的一些注意事项. 项目介绍与测试样例 官网 ...

  7. 视觉SLAM十四讲作业练习(1)

    4 CMake 练习 书写一个由 cmake 组织的 C++ 工程,要求如下: include/hello.h 和 src/hello.c 构成了 libhello.so 库.hello.c 中提供一 ...

  8. 视觉SLAM十四讲学习笔记——第十三讲 实践:设计SLAM系统

    1.如何运行示例代码 首先是如何运行示例代码,这里遇到了很多问题: (1)首先要下载Kitti数据集,并在config/default.yaml文件内修改路径. (2)安装Glog.GTest.GFl ...

  9. 转:Linux下安装Gtest/Gmock

    1.获取GTest/GMock源码 从Google网站上Http://Code.Google.Com/P/Googlemock/Downloads/List下载GMock源码(GMock源码中包含GT ...

最新文章

  1. 诺亚面向语音语义的深度学习研究进展
  2. 记录一个海思TOE的BUG
  3. jquery实现的3D缩略图悬停效果
  4. 【pyqt5学习】——containers相关控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)
  5. 计算机主机接线视频教程,电脑主板跳线怎么接?电脑机箱与主板跳线接法图解教程...
  6. 诗与远方:无题(八十)- 吸烟而作
  7. 让Python在后台自动解压各种压缩文件!
  8. HTTP和RPC的区别?
  9. socket不能bind请求的地址_深入浅出讲解:php的socket通信
  10. 【NOIP2018】【Luogu5019】铺设道路(贪心,差分)
  11. 15.Object Manager
  12. 工业企业能源管理系统
  13. java web 手机验证_java web实现手机短信验证码登录实例
  14. startwith的使用方法
  15. ZYNQMP_XAZU3EG_VxWorks7 添加USB2.0 USB3.0
  16. 安徽大学计算机学院张兴义教授,“2018年CCF合肥为新研究生导航” 开启复合型人才培养之路...
  17. 服务于离群点检测的无监督特征选择值-特征层次耦合模型
  18. 石头扫地机器人卡顿_80后手残党动手修理石头扫地机器人激光头卡死故障
  19. DATEADD() 函数详细说明
  20. Python matplotlib 批量绘图内存不够问题(Out of memory)

热门文章

  1. (附源码)ssm基于微信小程序的社区老人健康管理服务系统的设计与实现 毕业设计 011513
  2. 期货模拟和仿真的区别(模拟期货与实盘期货区别)
  3. imx6ull gpio 中断
  4. linux bt4 u盘版下载,高手用U盘安装BT4
  5. 微信h5支付前端代码
  6. Supervised Online Hashing via Hadamard Codebook Learning
  7. 【微信开发第四章】SpringBoot实现微信H5支付
  8. 副驾驶的意义_副驾驶对女人的意义是什么样的?
  9. linux无法关闭防火墙设置,Linux关闭防火墙以及设置允许端口
  10. 答读者问(18):一个大四学生有关专业发展的相关疑问