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 = 1; //輸出到控制台 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 09:44:37.912454 5494 main_log.cpp:7] info test W0531 09:44:37.912642 5494 main_log.cpp:8] warning test E0531 09:44:37.912667 5494 main_log.cpp:9] error test I0531 09:44:37.912691 5494 main_log.cpp:11] 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 11) #規定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 = 0; // Set log output speed(s) FLAGS_max_log_size = 1024; // 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++11
就可以了啊,但是,,,想得美,人家給報錯了,報錯是這樣的:
./libglog.a(libglog_la-logging.o): In function `__static_initialization_and_destruction_0': /home/center/glog/src/logging.cc:112: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' /home/center/glog/src/logging.cc:115: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' /home/center/glog/src/logging.cc:117: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' /home/center/glog/src/logging.cc:119: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' /home/center/glog/src/logging.cc:122: 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:133: more undefined references to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' follow collect2: error: ld returned 1 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++11
不愧是我,一句都沒報錯,直接可以運行。。。
最后說一句,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