常见错误
Glog是Google提供的一个非常有效的程序文档工具,已经被应用到许多开发工程中。但是在使用Glog时,会遭遇到一些奇怪的问题,本文将分析问题产生的原因和提供解决方案。
- ERROR:unknown command line flag ‘logtostderr’
- undefined reference to ‘google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, bool*, bool*)’
- 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)
解决方法
- 注意编译顺序,应该是先编译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;
}