c++ google glog模块安装和基本使用(ubuntu)环境
1,如何安装
1 Git clone https://github.com/google/glog.git
2 cd glog
3 ./autogen.sh
4 ./configure --prefix=path(install)
5 make
6 make install
说一下,下载下来的源码包里带有CMakeList.txt和makefile,所以如果你想把编译的东西隔离出来,并且已经装好了cmake,也可以新建一个build,依次执行:cd build,cmake ..,make,然后就可以在里面看到编译出来用的东西了。
需要用的东西在哪里?
1,方法1:
你的下载目录/glog/.libs/libglog.a
你的下载目录/src/glog (下面有一堆h头文件)
还有一个so文件,不知道是否有用:和.a文件在同一个目录下
2,方法2
build/libglog.a
build/glog/(头文件)
2,最简单的demo
//this is main_log.cpp #include "glog/logging.h" // glog 头文件 int main(){
google::InitGoogleLogging("daqing"); //初始化一个log
FLAGS_logtostderr = ; //输出到控制台 LOG(INFO) << "info test"; //输出一个Info日志
LOG(WARNING) << "warning test"; //输出一个Warning日志
LOG(ERROR) << "error test"; //输出一个Error日志
//LOG(FATAL) << "fatal test"; //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序,暂时注掉
LOG(INFO)<<"info test lastone";
google::ShutdownGoogleLogging(); //不用log的时候应该释放掉,不然会内存溢出 }
//正确的返回结果应该是这样的:
I0531 ::37.912454 main_log.cpp:] info test
W0531 ::37.912642 main_log.cpp:] warning test
E0531 ::37.912667 main_log.cpp:] error test
I0531 ::37.912691 main_log.cpp:] info test lastone
如何编译呢?
3,g++编译
经过复制粘贴,我的目录结构是这样的:
./libglog.a
./include/glog/(一堆头文件)
编译命令:g++ main_log.cpp ./libglog.a -I ./include -std=c++11 -DDEBUG -lpthread -o sample
一般ubuntu自带g++(或者g++,学名好像叫gun),没有的话apt-get也可以安。
-lpthread是个啥?
g++ -l参数就是用来指定程序要链接的库,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把 libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了,所以-lpthread指向的是一个叫libpthread.so的库文件,并且我和找到了这个库,是这样的/usr/lib/x86_64-linux-gnu/libpthread.so,话说,为啥中间隔了一层啊喂。这个库据说是处理多线程的,大约glog是自己一个线程跑得吧。也挺科学的。
g++的其他参数:
.a文件直接在cpp文件后面就可以了,头文件需要用-I(杠i)指明,-std指定c++版本和标准,-o指定输出的文件是sample,实际运行:./sample
4,cmake编译
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD )
#规定cmake的最低版本,用以提示用户升级cmake
project(daqing) add_executable(daqing main33.cpp )
#依据给定的脚本生成一个叫daqing的可执行文件
find_package(Threads)
#据说find会在环境的路径中寻找相关的或者依赖的lib,大约是需要在-lpthread之前先定义一个变量或者找一找吧
include_directories("/home/center/c/include")
#头文件在哪里呢?
target_link_libraries(daqing "/home/center/c/libglog.a" ${CMAKE_THREAD_LIBS_INIT})
#这句话指定在链接目标文件的时候需要链接的外部库,其效果类似gcc的编译参数“-l”,可以解决外部库的依赖问题,当然了,变量的顺序不能变,不然会造成错误
5,如何打印日志?
#include "glog/logging.h" // glog 头文件 int main(){
google::InitGoogleLogging("Daqing"); //初始化log的名字为daqing
google::SetLogDestination(google::GLOG_INFO, "./test_log/"); //设置输出日志的文件夹,文件夹必须已经存在
google::SetStderrLogging(google::GLOG_WARNING);
google::SetLogFilenameExtension("log_");
FLAGS_colorlogtostderr = true; // Set log color
FLAGS_logbufsecs = ; // Set log output speed(s)
FLAGS_max_log_size = ; // Set max log file size
FLAGS_stop_logging_if_full_disk = true; // If disk is full LOG(INFO) << "hello i am info!";
LOG(WARNING) << "hello i am warning test"; //输出一个Warning日志
LOG(ERROR) << "hello i am error test"; //输出一个Error日志
google::ShutdownGoogleLogging();
}
打印到日志(框加不上,直接复制吧)
#include "glog/logging.h" // glog 头文件
int main(int argc,char* argv[]){
FLAGS_log_dir="/home/center/daqing/glog_project/logs";
//FLAGS_logtostderr = true; //设置日志消息是否转到标准输出(控制台)
FLAGS_alsologtostderr = true; //设置日志消息除了日志文件之外是否去标准输出
//FLAGS_colorlogtostderr = true; //设置记录到标准输出的颜色消息(如果终端支持)
FLAGS_log_prefix = true; //设置日志前缀是否应该添加到每行输出
FLAGS_logbufsecs = 1; //设置可以缓冲日志的最大秒数,0指实时输出
FLAGS_max_log_size = 100; //设置最大日志文件大小(以MB为单位)
FLAGS_stop_logging_if_full_disk = true; //设置是否在磁盘已满时避免日志记录到磁盘
google::InitGoogleLogging(argv[0]); //根据程序名称初始化一个日志
//google::SetLogDestination(google::GLOG_ERROR, "/home/center/daqing/glog_project/logs/error_");
LOG(INFO) << "info test"; //输出一个Info日志
LOG(WARNING) << "warning test"; //输出一个Warning日志
LOG(ERROR) << "error test"; //输出一个Error日志
//LOG(FATAL) << "fatal test"; //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序,暂时注掉
LOG(INFO)<<"info test lastone";
google::ShutdownGoogleLogging(); //不用log的时候应该释放掉,不然会内存溢出
}
6,2020.01.03更新
因为项目需要,最近又重新编译了一下glog,发现竟然跑不起来了!哭,有可能是环境不一样,也有可能是git上的源代码更新了,在此更新一下自己的安装过程,
缺依赖的提前装一下依赖哦:
sudo apt-get install autoconf automake libtool
git clone https://github.com/google/glog.git
cd glog
##./configure --prefix=path(install)改成了如下的命令
./configure CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib"
#我估计,大概的意思就是头文件放到了/usr/local/include下,库文件在/usr/local/lib,反正后期g++我正好用,这样的好处是,不用在乱七八糟的安装目录中一通狂找
make
sudo make install
安装完成以后按理说,这个时候复制一下标题2里的demo代码,然后随便找个目录创建main.cpp ,把libglog.a复制到当前文件夹下,执行:
g++ main.cpp ./libglog.a -I /usr/local/include -L /usr/local/lib -o main.out -lpthread -std=c++
就可以了啊,但是,,,想得美,人家给报错了,报错是这样的:
./libglog.a(libglog_la-logging.o): In function `__static_initialization_and_destruction_0':
/home/center/glog/src/logging.cc:: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
/home/center/glog/src/logging.cc:: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
/home/center/glog/src/logging.cc:: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
/home/center/glog/src/logging.cc:: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
/home/center/glog/src/logging.cc:: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
./libglog.a(libglog_la-logging.o):/home/center/glog/src/logging.cc:: more undefined references to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' follow
collect2: error: ld returned exit status
什么?gflags???黑人问号脸,,,,行吧,我再去编译一下gflags
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build
cmake .. -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC ..
make -j4
sudo make install
此处参考:感谢原作者
然后我通过sudo find / -name libgflags.a找到了一个动态库,嘿嘿,我们不如把它,,,拷到main.cpp的目录下,然后,缺啥引啥
g++ main.cpp ./libglog.a ./libgflags.a -I /usr/local/include -L /usr/local/lib -o main.out -lpthread -std=c++
不愧是我,一句都没报错,直接可以运行。。。
最后说一句,c++关联太多,我也不知道啥是啥了,也不知道为啥不需要gflags的头文件和so库,就记个笔记留着以后找吧:
glog安装包目录:~/glog -I(-i) /usr/local/include -L /usr/local/lib 动态库:/usr/local/lib/libglog.a
gflags安装包目录:~/glog/gflags/build -i和-L估计都在里面,另外在-I(-i) /usr/local/include -L /usr/local/lib中貌似也有gflags的库和头,动态库:/usr/lib/x86_64-linux-gnu/libgflags.a
c++ google glog模块安装和基本使用(ubuntu)环境的更多相关文章
- window环境下glog的安装
window环境下glog的安装 分类: c++2014-09-23 14:12 32人阅读 评论(0) 收藏 举报 下载后解压,利用Visual Studio打开google-glog.sln.生成 ...
- perl模块安装
转自: http://www.cnblogs.com/itech/archive/2009/08/10/1542832.html http://www.mike.org.cn/blog/index.p ...
- python安装、模块安装
python安装 windows 下载安装包 https://www.python.org/downloads 改环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[ ...
- python之模块安装
在python中,python官方提供了很多可以扩展的包,用以增强python的功能. 因为用到了excel的读写功能,需要安装xlrd的包,一下是安装步骤 1.首先从python的官方库下载相应的包 ...
- python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)
在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...
- Google glog 使用
Google glog 使用 1 简介 Googleglog 库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏. 代码示例: #include <glog/logg ...
- [转] npm 模块安装机制简介
npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一. 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 . $ npm install 本文介绍 npm ...
- npm 模块安装机制简介
npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一. 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 . $ npm install 本文介绍 npm ...
- Mac MySQLdb模块安装,可算解决了
转载:http://blog.csdn.net/janronehoo/article/details/25207825 短评:这篇文章感觉是比较全面解决Mac MySQLdb模块安装问题的文章了,特别 ...
随机推荐
- golang channel 的一次内存错误
起因 原因调查 原因分析 问题解决 总结 起因 今天在做数据库数据读取时, 首先通过多个 goroutine 将从数据库读取的数据写入 channel, 同时通过另一个 goroutine 从 cha ...
- P5331 [SNOI2019]通信 [线段树优化建图+最小费用最大流]
这题真让人自闭-我EK费用流已经死了?- (去掉define int long long就过了) 我建的边害死我的 spfa 还是spfa已经死了? 按费用流的套路来 首先呢 把点 \(i\) 拆成两 ...
- 【Python】圆周率的计算
1.公式法 代码: #CalPiV1.py pi=0 N=100 for k in range(N): pi+=1/pow(16,k)*(\ 4/(8*k+1)-2/(8*k+4)-\ 1/(8*k ...
- eureka server 单节点与多节点部署演示
环境搭建 目录结构(ad-eureka为子模块) --ad-spring-cloud --ad-eureka --pom.xml --pom.xml 主pom.xml <?xml version ...
- 163.扩展User模型-一对一方式扩展
一对一外键 如果你对用户验证方法authenticate没有更多的要求,就是使用username和password就可以完成用户的登录验证工作,但是想要在原来的模型的基础上添加新的字段,那么就可以使用 ...
- AngularJS中transclude用法详解
这篇文章主要介绍了AngularJS中transclude用法,详细分析了transclude的具体功能.使用技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了AngularJS中transcl ...
- vscode中LaTeX的编写
前言 在学习\(\mathrm{\LaTeX}\)的时候尝试过很多编辑器,但都被其复古的外观或者复杂的配置劝退.并且因为本身就在使用VScode写其他的一些语言,正好借此机会也学习一下怎么用VScod ...
- davinci入门必读
http://www.usr.cc/forum.php/static/image/smiley/tiger/archiver/forum.php?mod=viewthread&action=p ...
- 使用yaml格式进行接口测试报错
前言:本人公司使用yaml做接口测试.某日开发写了一个字典嵌套列表,列表里面再嵌套字典的接口. yaml的值应该为下图(注意缩进问题) 加了-代表下面是一个列表 {'uid': '3a61479f ...
- 题解【洛谷P3958】[NOIP2017]奶酪
题面 题解 我们考虑使用一个并查集维护空洞之间的关系. 如果两个空洞能相互到达,那么它们的祖先也是相同的. 枚举从哪一个空洞开始,能否到达奶酪的上表面. 如果能到达就输出Yes,否则输出No. 注意开 ...