window环境下glog的安装

载后解压,利用Visual Studio打开google-glog.sln。生成解决方案

打开sln会有几个项目,libglog是动态库,生成dll,libglog_static是静态库,生成lib。

安装:

方法一:将libglog.dll和libglog.lib文件,拷贝文件到你的工程文件夹下,并拷贝src\windows\下的glog目录到你的工程文件下。

方法二:你也可以将这两个文件拷贝到系统文件夹下,实现全局访问。

1. 将libglog.dll拷贝到C:\Program Files\Microsoft Visual Studio 11.0\VC\bin

2. 将libglog.lib拷贝到C:\Program Files\Microsoft Visual Studio 11.0\VC\lib

3. 将src\windows\下的glog目录拷贝到C:\Program Files\Microsoft Visual Studio 11.0\VC\include

#include "glog/logging.h"
#include <iostream>
#include <vector>
using namespace std;
#pragma comment(lib,"libglog.lib") int main(int argc, char* argv[])
{
// Initialize Google's logging library.
google::InitGoogleLogging(argv[]);
google::SetLogDestination(google::INFO,"E://");
// 设置日志路径 INFO WARNING ERROR FATAL
// ...
char str[] = "hello log!";
LOG(INFO) << "Found " << google::COUNTER <<endl;
LOG(INFO) << str ;//<< " cookies";
LOG(WARNING) << "warning test"; // 会输出一个Warning日志
LOG(ERROR) << "error test";//会输出一个Error日志 system("pause");
return ;
}
说明:
1:生成解决方案 
     不是调试,而是生成 =》生成解决方案(或者快捷键F7)
2:会新生成一个目录Debug,所有的libglog.dll和libglog.lib就位于Debug目录下
3:推荐使用第二种方式
 
 
我编译出现错误:

1> glogTest.cpp
1> 正在生成代码...
1>glogTest.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InitGoogleLogging(char const *)" (__imp_?InitGoogleLogging@google@@YAXPBD@Z),该符号在函数 _main 中被引用
1>glogTest.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall google::LogMessage::LogMessage(char const *,int)" (__imp_??0LogMessage@google@@QAE@PBDH@Z),该符号在函数 _main 中被引用
1>glogTest.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall google::LogMessage::LogMessage(char const *,

库目录和lib目录以及libglog_static.lib都配置了,按照道理来说不可能出现无法解析的外部符号。

我看一篇文章说的是字符集的问题:

error LNK2019: 无法解析的外部符号 "__declspec(dllimport)

我在VS2005下写C++的程序,采用一个工程生成DLL文件给另一个工程执行,但每次执行时都出现 error LNK2019: 无法解析的外部符号 "__declspec(dllimport)错误。检查了好几遍代码都觉得没有问题。

最后发现是字符集出现问题。生成DLL文件的字符集是Unicode而生成exe文件的字符集为默认的ASCII。

只要统一字符集即可解决问题:

VS2005的c++项目默认字符集是使用 Unicode 字符集,在项目属性->配置属性-->常规->项目默认值->字符集中设置字符集即可。

补充VC6.0是默认采用ASCII字符集的。

我把glog改成了unicode字符集还是不行。

 
 
glog如何采用静态链接的方式呢?答案是要看官方doc文档的说法:在自定义工程中添加“GOOGLE_GLOG_DLL_DECL=” 和 “GLOG_NO_ABBREVIATED_SEVERITIES” 这两个宏,第二个宏主要是为了避免与windows.h冲突(下面会讲到),第一个宏才是使用静态链接库时必须的!在编译时可以编译两个版本:Release 和 Debug 以供调试时使用。
 
 
环境:

XPsp3 vs2005 glog-0.3.3 http://download.csdn.net/detail/chenguangxing3/6661667

 
编译:
glog-0.3.3里面有vs2008的sln,vs2005可以直接修改sln和vcproj降版本.
打开sln直接编译就行了,没悬念.编译后生成: libglog.dll libglog.lib libglog_static.lib. 头文件在src\windows\glog
 

使用:

文件包含和宏定义:
#define GOOGLE_GLOG_DLL_DECL           // 使用静态glog库用这个
#define GLOG_NO_ABBREVIATED_SEVERITIES // 没这个编译会出错,传说因为和Windows.h冲突
#include "glog/logging.h"
#pragma comment(lib,"glog/libglog_static.lib")
 
设置参数,输出日志:
FLAGS_log_dir = "c:\\GLogFiles";     // 设置日志文件保存目录,这个目录必须是已经存在的,否则不能生成日志文件.
 
// GLog生成的文件名格式是[文件名].[计算机名].[Windows用户名].[log].[等级].[年月日时分秒].[PID]例如:abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-112354.3108
// 每个进程中至少要执行1次InitGoogleLogging(),否则不产生日志文件.例如:只在xxApp::InitInstance()中调用一次InitGoogleLogging(),xxDlg中不必调用也会把日志输出到指定文件.
google::InitGoogleLogging("abc.exe");// 设置日志文件名中的"文件名"字段.
 
LOG(INFO) << "我在InitInstance()";   // 记录一个INFO等级的日志"我在InitInstance()"
 
google::ShutdownGoogleLogging();     // 停止GLog,与InitGoogleLogging()成对使用.没有这句vs2005会有内存泄漏,但是网上好多例子都没有用这句
/*
上面代码生成了名为"abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-134009.4068"的日志,内容是:
Log file created at: 2013/12/05 13:40:09
Running on machine: J2RT9QDBPIXKGEO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I1205 13:40:09.375000  2460 abc.cpp:75] 我在InitInstance()
*/
 

问题:

GLog好像不支持Unicode

-----------
glog介绍
 本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬误,欢迎大家指出!英文原文见http://google-glog.googlecode.com/svn/trunk/doc/glog.html

 
1.   概述
      Google glog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例:
       LOG(INFO) << "Found " << num_cookies << " cookies";
“LOG”宏为日志输出关键字,“INFO”为严重性程度。
主要支持功能:
1, 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
2, 严重性分级,根据日志严重性分级记录日志;
3, 可有条件地记录日志信息;
4, 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
5, 异常信号处理。程序异常情况,可自定义异常处理过程;
6, 支持debug功能。可只用于debug模式;
7, 自定义日志信息;
8, 线程安全日志记录方式;
9, 系统级日志记录;
10, google perror风格日志信息;
11, 精简日志字符串信息。
 
2.   功能使用
1.1  参数设置
       可通过命令行方式设置glog的标志参数,用来控制日志记录行为。
命令格式如下:
      标志名1 = 标志值 标志名2=标志值 …… 标志值n=标志值        ./程序名
所有标志名需添加统一前缀—“GLOG_”,不同标志语句之间以空格相隔;
例如:
-- GLOG_vmodule=mapreduce=2,file=1,gfs*=3  -- GLOG_v=0 ./application.exe
 
常用标志参数类型及其作用说明:
标志参数 类型 作用
logtostderr bool 值为true的时候,日志信息输出到stderr,并非文件。默认值为 false。
stderrthreshold int
严重性级别在该门限值以上的日志信息除了写入日志文件以外,还要输出到stderr。各严重性级别对应的数值:INFO—0,WARNING—1,ERROR—2,FATAL—3
默认值为2.
minloglevel int
严重性级别在该门限值以上的日志信息才进行记录。
默认值为0.
log_dir string

日志信息记录路径。默认为空,如果没有指定信息输出到stderr,则信息保存在"/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>"文件中。 (e.g., "/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474").

v int 对于使用“ VLOG(m)”(m为int型)表达式进行输出的日志信息,只在m的值小于该标志的值的时候,才进行输出。另外, 该设置可能被 vmodule标志给覆盖.默认为0.
vmodule string

分模块(文件)设置VLOG(m)日志信息的输出基本。命令格式为以逗号分开的“<module name>=<log level>”表达式组成。其中<module name> 是“glob pattern”,支持通配符,<module name>不包括文件的扩展名(.h,.cc等)。

 
表1标志说明
还有其他的标志参数定义在logging.cc,可在文件中搜索“DEFINE_”来进行查看。
1.2     严重性分级记录信息
glog可通过根据指定的严重性等级,来选择性记录日志。日志信息严重性等级按由低到高排列依次为:INFO,WARNINGERROR, 和 FATAL四级。使用者可以在命令行中设置严重性等级门限值来控制日志的输出,详细见“参数设置”部分的“minloglevel”标志值的介绍。
1.3     有条件地记录日志信息
glog可以控制日志信息在指定条件下进行记录。具体使用如下:

1, LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

上面的语句表示,只有当num_cookies > 10条件成立时,“Got lots of cookies”日志信息才被记录。

 

2, LOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";

上面的语句表示,在程序中周期性的记录日志信息,在该语句第1、11、21……次被执行的时候,记录日志信息。COUNTER变量表示该语句被执行的次数。
 

3, LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER<< 
"th big cookie";

上面的语句为1,2项功能的合并,size>1024的条件连续成立10次的时候记录日志信息。COUNTER变量表示该条件成立的次数。
 

4, LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie";

上面的语句表示,当该语句只在首次执行了20次以后记录日志信息, COUNTER变量表示该语句被执行的次数。

1.4     有条件地中止程序
       glog提供了CHECK宏,用于在调试地时候中止程序,及早发现程序错误。当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的日志信息。功能类似于ASSERT,区别是CHECK宏不受NDEBUG约束,在release版中同样有效。具体使用如下:
                 CHECK(fp->Write(x) == 4) << "Write failed!";
       当fp->Write(x) == 4成立时,记录“Write failed!”日志信息,并且中止程序,其中fp->Write(x) == 4为判定条件,日志信息以c++的stream操作形式生成。
glog提供了多个便利的宏来处理特定关系的判定。具体有:

1,判定大小关系

CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用这些宏需要注意类型一致,如果出现类型不一致的,可使用static_cast转换。

2,判定指针是否为空

        CHECK_NOTNULL(some_ptr),可用于对象初始化的时候。

3,判定字符串是否相等

         CHECK_STREQCHECK_STRNECHECK_STRCASEEQCHECK_STRCASENE。可进行大小写敏感或不敏感字符串来分别判定。
4,     判定浮点是否相等或相近
CHECK_DOUBLE_EQ,CHECK_NEAR。这两个宏都需要指定一个可容忍的偏差上限。
当这些宏判定条件不成立时,glog会生成一个FATAL级别的日志信息,该信息包含比较的两个值和stream方式传入的字符串,然后中止程序。
1.5     异常信号处理
      glog提供了比较方便的程序异常处理机制。例如,当程序出现SIGSEGV异常信号时,glog的默认异常处理过程会导出非常有用的异常信息。异常处理过程可以通过google::InstallFailureSignalHandler()来自定义。下面为异常处理过程的输出例子:
*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date ***

*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***

PC: @           0x412eb1 TestWaitingLogSink::send()

    @     0x7f892fb417d0 (unknown)
    @     0x412eb1 TestWaitingLogSink::send()

@     0x7f89304f7f06 google::LogMessage::SendToLog()

    @     0x7f89304f35af google::LogMessage::Flush()

@     0x7f89304f3739 google::LogMessage::~LogMessage()

    @     0x408cf4 TestLogSinkWaitTillSent()
    @     0x4115de main
    @     0x7f892f7ef1c4 (unknown)

@     0x4046f9 (unknown)

默认情况下,异常信息是输出到stderr,通过InstallFailureWriter()可以改变输出目标。
 
1.6     支持debug功能
      glog提供特定的宏只在debug模式下生效。以下分别对应LOG、LOG_IF、DLOG_EVERY_N操作的专用宏。

DLOG(INFO) << "Found cookies";

DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";

1.7     自定义日志信息
        glog提供VLOG宏,让用户自定义分级信息,该分级与LOG宏对应的严重性分级是独立管理,在命令行参数设置中独立设置“v”或“vmodule”参数来控制,具体见“参数设置”部分标志说明。VLOG宏便于用户调试、查找完问题以后,屏蔽日志信息,减轻负担。具体使用如下:
 
  VLOG_IF(1, (size > 1024))<< "I'm printed when size is more than 1024 and when you run the ""program with --v=1 or more";
       上面的语句,只有在size>1024成立时且命令行参数v的值不小于1,才记录日志信息。
 
  VLOG_EVERY_N(1, 10)<< "I'm printed every 10th occurrence, and when you run the program ""with --v=1 or more. Present occurence is " << COUNTER;
       上面的语句,只有在命令行参数v的值不小于1时,才会每执行10次记录一次日志信息。
 
  VLOG_IF_EVERY_N(1, (size > 1024), 10)<< "I'm printed on every 10th occurence of case when size is more "" than 1024, when you run the program with --v=1 or more. "; "Present occurence is " << COUNTER;
       上面的语句,只有在命令行参数v的值不小于1时,若size>1024条件连续成立10次,记录一次日志信息。
 
1.8     线程安全日志记录
      glog提供了线程安全的日志记录方式。在<glog/raw_logging.h>文件中提供了相关的宏,如,RAW_CHECK,RAW_LOG等。这些宏的功能与CHECK,LOG等一致,除此以外支持线程安全,不需要为其分配任何内存和提供额外的锁(lock)机制。
 
1.9     系统级日志记录
  glog除了提供了普通的日志记录宏,还提供SYSLOG, SYSLOG_IF,和 SYSLOG_EVERY_N宏,这些宏将日志信息通过syslog()函数记录到系统日志。
1.10   google perror风格日志信息
     glog提供了与LOG*和CHECK宏作用等价的PLOG()、PLOG_IF() 和PCHECK()宏,不同的是,后者在记录日志信息的时候,会将errno的状态及其描述附加到日志描述中。
如:

PCHECK(write(1, NULL, 2) >= 0) << "Write NULL failed";

当条件不成立时,会输出日志信息:

F0825 185142 test.cc:22] Check failed: write(1, NULL, 2) >= 0 Write NULL failed: Bad address [14]

1.11   精简日志字符串信息
      日志信息的字符串会占用比较大的内存空间,另外还带来隐私泄露的问题。glog提供了GOOGLE_STRIP_LOG宏在编译时候去除日志的字符串信息。
 
3.   其他说明
1, windows平台使用注意
因为glog的严重性级别中使用了ERROR宏,与<windows.h>文件中冲突,可通过以下两种方式避免:
     a,在包含<windows.h>文件之前,定义宏WIN32_LEAN_AND_MEAN 或者NOGDI。
     b,在包含<windows.h>文件之后,undef掉ERROR定义。
 
更多:http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html

glog安装与使用的更多相关文章

  1. ubutun16.04 安装编译glog日志库

    glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API.在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数(可以参见gflags ...

  2. Glog

    Glog的简单入门,glog虽然在配置参数方面比较麻烦,但是在小规模程序中,由于其简单灵活,也许会有优势. 0,  glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活 ...

  3. centos7.2下caffe的安装及编译

    1.前期准备 安装依赖 sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5 ...

  4. CentOS6.9下安装 Pika 2.2.5(新增了拷贝安装版本的办法+对于PID的位置及数据库位置的理解)

    一.环境准备 yum install -y snappy-devel  protobuf-compiler  protobuf-devel bzip2-devel  zlib-devel bzip2 ...

  5. solus 系统 - 编译安裝 ibus-rime 中文输入法(附:小鹤双拼双形配置文件)

    編譯方法參見官網 - https://github.com/rime/home/wiki/RimeWithIBus 安装依赖:列出几个可能用到的命令 #安裝cmake gcc等开发工具 sudo eo ...

  6. window环境下glog的安装

    window环境下glog的安装 分类: c++2014-09-23 14:12 32人阅读 评论(0) 收藏 举报 下载后解压,利用Visual Studio打开google-glog.sln.生成 ...

  7. ubuntu 14.04 安装 glog

    1.下载 git clone https://github.com/google/glog 2.配置 sudo apt-get install autoconf automake libtool 3. ...

  8. Ubuntu14.04下安装glog

    下载原始代码编译 1. Clone Source Code  glog git clone https://github.com/google/glog 2. Install dependencies ...

  9. c++ google glog模块安装和基本使用(ubuntu)环境

    1,如何安装 1 Git clone https://github.com/google/glog.git 2 cd glog 3 ./autogen.sh 4 ./configure --prefi ...

随机推荐

  1. 【jersey】 spring 整合jersey 实现RESTful webservice

         Jersey是一个RESTFUL请求服务JAVA框架,与常规的JAVA编程使用的struts框架类似,它主要用于处理业务逻辑层.与Struts类似,它同样可以和hibernate,sprin ...

  2. shell基础篇(十)shell脚本的包含

    前记 写到这里:shell中基础差不多已经讲完了.希望你已经对shell有了一个基本了解.你可能跃跃欲试,要写一些程序练习一下.这会对你很有好处.建议大家去chinaunix去学习:我是li0924. ...

  3. Linux mii-tool 命令

    mii-tool 用来查看或设置网卡的相关参数,该命令已经过时了,推荐使用 ethtool 命令 [root@localhost ~]$ mii-tool -v eth1 # 查看网卡的相关信息,包括 ...

  4. 《C++ Primer Plus》15.1 友元 学习笔记

    15.1.1 友元类假定需要编写一个模拟电视机和遥控器的简单程序.决定定义一个Tv类和一个Remote类,来分别表示电视机和遥控器.遥控器和电视机之间既不是is-a关系也不是has-a关系.事实上,遥 ...

  5. PyQt4信号与槽

    事件 事件(Events)是GUI程序中很重要的一部分.它由用户或系统产生.当我们调用程序的exec_()方法时,程序就会进入主循环中.主循环捕获事件并将它们发送给相应的对象进行处理.奇趣公司(Tro ...

  6. iOS设计模式之类族(class cluster)

    类族模式在UIKit(user interface framework)使用的范围已经远远超过我们的想象,比如,UIButton,NSArray,NSString,NSNumber等, 例如NSNum ...

  7. ubuntu 备忘

    卷组扩容 Linux mint采用默认卷组的安装方式 sain@Linux ~ $ df -hl Filesystem Size Used Avail Use% Mounted on udev .7G ...

  8. 【python系列】SyntaxError:Missing parentheses in call to 'print'

    打印python2和python3的区别 如上图所示,我的 PyCharm安装的是python3.6如果使用print 10会出现语法错误,这是python2.x和python3.x的区别所导致的.

  9. Git学习笔记(SourceTree克隆、提交、推送、拉取等)

    学习一下sourcetree使用git 目录 一 克隆Clone 二 提交Commit和推送Push 三 拉取pull和获取fetch 四 版本回退reset 五 检出checkout 六 标签Tag ...

  10. Nginx降权启动

            给Nginx服务降权,用lol用户跑Nginx,给开发及运维设置普通账号,只要和lol同组即可管理Nginx,该方案解决了Nginx管理问题,防止root分配权限过大. 开发人员使用普 ...