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 = 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM