載后解壓,利用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[0]); google::SetLogDestination(google::INFO,"E://"); // 設置日志路徑 INFO WARNING ERROR FATAL // ... char str[20] = "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 0; }
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字符集還是不行。
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:09Running on machine: J2RT9QDBPIXKGEOLog line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msgI1205 13:40:09.375000 2460 abc.cpp:75] 我在InitInstance()*/
GLog好像不支持Unicode
| 標志參數 | 類型 | 作用 |
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 | 分模塊(文件)設置 |
INFO,
WARNING,
ERROR, 和
FATAL四級。使用者可以在命令行中設置嚴重性等級門限值來控制日志的輸出,詳細見“參數設置”部分的“
minloglevel”標志值的介紹。
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";
3, LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER<<
"th big cookie";
4, LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie";
上面的語句表示,當該語句只在首次執行了20次以后記錄日志信息, COUNTER變量表示該語句被執行的次數。
1,判定大小關系
CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用這些宏需要注意類型一致,如果出現類型不一致的,可使用static_cast轉換。
2,判定指針是否為空
3,判定字符串是否相等
CHECK_STREQ,
CHECK_STRNE,
CHECK_STRCASEEQ,
CHECK_STRCASENE
。可進行大小寫敏感或不敏感字符串來分別判定。
4,
判定浮點是否相等或相近
CHECK_DOUBLE_EQ
,CHECK_NEAR。這兩個宏都需要指定一個可容忍的偏差上限。
*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
PC: @ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f89304f7f06 google::LogMessage::SendToLog()
@ 0x7f89304f3739 google::LogMessage::~LogMessage()
@ 0x4046f9 (unknown)
DLOG(INFO) << "Found cookies";
DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";
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]
