gflags,glog,gtest学习
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学习相关推荐
- GTest学习笔记(一)
GTest学习笔记(一) 环境准备:CMake+Visual Studio 原博客: (20条消息) 记gtest1.10.0安装过程及简单使用_wingrez的博客-CSDN博客 使用GTest搭建 ...
- Ubuntu 16.04 系统 gflags glog 安装
系统环境 Ubuntu 16.04 GCC 5.4 安装步骤 安装 GFlags 运行如下指令: git clone https://github.com/gflags/gflags.git cd g ...
- gtest 学习之五 测试用例中定义类
上一个例子中被测试的类是作为测试类的一个成员变量,在本例中没有测试类,被测试类只能在一个测试用例中定义使用 头文件sample4.h #ifndef GTEST_SAMPLES_SAMPLE4_H_ ...
- gtest学习笔记--2测试夹具(类)TEST_F
相关的配置与参考可以看相同系列的第一篇.本篇只提供代码. test_02.h #ifndef GTEST_SAMPLES_SAMPLE3_INL_H_ #define GTEST_SAMPLES_SA ...
- apollo如何添加第三方库,以pylon为例
1.在apollo/third_party/ 里面增加pylon文件夹 workspace.bazel """Loads the OpenCV library" ...
- facebook surround360 环境配置,编译,测试(生成双目立体全景图)
surround360是facebook开源的一套集采集,渲染与一体的全景内容制作解决方案,其中使用到了诸多开源库,花了几天时间才把它跑通,下面就记录一下其中的一些注意事项. 项目介绍与测试样例 官网 ...
- 视觉SLAM十四讲作业练习(1)
4 CMake 练习 书写一个由 cmake 组织的 C++ 工程,要求如下: include/hello.h 和 src/hello.c 构成了 libhello.so 库.hello.c 中提供一 ...
- 视觉SLAM十四讲学习笔记——第十三讲 实践:设计SLAM系统
1.如何运行示例代码 首先是如何运行示例代码,这里遇到了很多问题: (1)首先要下载Kitti数据集,并在config/default.yaml文件内修改路径. (2)安装Glog.GTest.GFl ...
- 转:Linux下安装Gtest/Gmock
1.获取GTest/GMock源码 从Google网站上Http://Code.Google.Com/P/Googlemock/Downloads/List下载GMock源码(GMock源码中包含GT ...
最新文章
- 诺亚面向语音语义的深度学习研究进展
- 记录一个海思TOE的BUG
- jquery实现的3D缩略图悬停效果
- 【pyqt5学习】——containers相关控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)
- 计算机主机接线视频教程,电脑主板跳线怎么接?电脑机箱与主板跳线接法图解教程...
- 诗与远方:无题(八十)- 吸烟而作
- 让Python在后台自动解压各种压缩文件!
- HTTP和RPC的区别?
- socket不能bind请求的地址_深入浅出讲解:php的socket通信
- 【NOIP2018】【Luogu5019】铺设道路(贪心,差分)
- 15.Object Manager
- 工业企业能源管理系统
- java web 手机验证_java web实现手机短信验证码登录实例
- startwith的使用方法
- ZYNQMP_XAZU3EG_VxWorks7 添加USB2.0 USB3.0
- 安徽大学计算机学院张兴义教授,“2018年CCF合肥为新研究生导航” 开启复合型人才培养之路...
- 服务于离群点检测的无监督特征选择值-特征层次耦合模型
- 石头扫地机器人卡顿_80后手残党动手修理石头扫地机器人激光头卡死故障
- DATEADD() 函数详细说明
- Python matplotlib 批量绘图内存不够问题(Out of memory)
热门文章
- (附源码)ssm基于微信小程序的社区老人健康管理服务系统的设计与实现 毕业设计 011513
- 期货模拟和仿真的区别(模拟期货与实盘期货区别)
- imx6ull gpio 中断
- linux bt4 u盘版下载,高手用U盘安装BT4
- 微信h5支付前端代码
- Supervised Online Hashing via Hadamard Codebook Learning
- 【微信开发第四章】SpringBoot实现微信H5支付
- 副驾驶的意义_副驾驶对女人的意义是什么样的?
- linux无法关闭防火墙设置,Linux关闭防火墙以及设置允许端口
- 答读者问(18):一个大四学生有关专业发展的相关疑问