Glog :常见错误及解决方案

常见错误

Glog是Google提供的一个非常有效的程序文档工具,已经被应用到许多开发工程中。但是在使用Glog时,会遭遇到一些奇怪的问题,本文将分析问题产生的原因和提供解决方案。

  1. ERROR:unknown command line flag ‘logtostderr’
  2. undefined reference to ‘google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, bool*, bool*)’
  3. undefined reference to `pthread_rwlock_wrlock’

ERROR:unknown command line flag ‘logtostderr’

产生原因

一般而言,从源代码编译安装glog时,会默认依赖gflags。如果此时gflags没有安装,编译安装的glog将无法使用gflags相关的命令,因此也无法在可执行程序后添加“ –logtostderr”。
值得注意的是,如果直接github上clone代码,注意其master分支上的CMakeLists.txt中48-53行存在一些问题,如下所示。建议下载tag v0.3.5版本。

if (WITH_GFLAGS)
  find_package (gflags 2.2.0)//如果你的gflags版本不是2.2.0,可能会有问题。

  if (gflags_FOUND)
    set (HAVE_LIB_GFLAGS 1)
    determine_gflags_namespace (gflags_NAMESPACE)
  endif (gflags_FOUND)
endif (WITH_GFLAGS)

解决方法

  1. 注意编译顺序,应该是先编译gflags,然后再编译glog。下图展示了编译glog时必须使用gflags的相关信息。
    这里写图片描述

undefined reference to ‘google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, bool*, bool*)’

产生原因

如果产生了此问题,通常是忘记在可执行程序中链接gflags。如果经常编译程序,一旦看到undefined reference,就可以大概猜到依赖库出了问题。

解决方法

如果是使用CMake文件,记的链接gflags库。
下边给出一个CMakeLists.txt的示例

cmake_minimum_required(VERSION 2.9)
project(test_glog)

add_executable(test_glog main.cpp)
target_link_libraries(test_glog  libgflags.a libglog.a)

undefined reference to `pthread_rwlock_wrlock’

产生原因

产生此问题的原因是在编译gflags和glog时,都会默认使用pthread。换句话说,此时可执行程序比如开始依赖pthread的相关依赖库。

解决方法

本问题有两个解决方案,一是直接链接pthread,二是使用gflags的非线程版本的依赖库。
1.链接pthread

find_package(Threads)

add_executable(test_glog main.cpp)
target_link_libraries(test_glog  libgflags.a libglog.a  ${CMAKE_THREAD_LIBS_INIT})

2.使用非线程版本

add_executable(test_glog main.cpp)
target_link_libraries(test_glog  libgflags_nothreads.a libglog.a)

示例

运行情况

~/Desktop/test_glog_gflags/build$ ./test_glog --logtostderr
I0608 11:11:03.898808 26336 main.cpp:14] 
I0608 11:11:03.898938 26336 main.cpp:15] HELLOok!
E0608 11:11:03.898953 26336 main.cpp:16] HELLOok!

CMakeLists.txt

cmake_minimum_required(VERSION 2.9)
project(test_glog)

find_package(Threads)

add_executable(test_glog main.cpp)
target_link_libraries(test_glog  libgflags.a libglog.a  ${CMAKE_THREAD_LIBS_INIT})

main.cpp

#include <iostream>

#include <glog/logging.h>  
#include <gflags/gflags.h>

DEFINE_string(test_input, "", "hello world");

int main(int argc, char **argv) 
{
    google::InitGoogleLogging(argv[0]);
    gflags::ParseCommandLineFlags(&argc, &argv, false);


    LOG(INFO)<<FLAGS_test_input;
    LOG(INFO) << "HELLO" << "ok!";   
    LOG(ERROR) << "HELLO" << "ok!";  
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u012348774/article/details/80558533
今日推荐