WIN10 + Qt 5.14(MSVC 2017,32bit) + APP项目(minGW-7.3.0 32bit)+glog

1.glog源码只支持按照文件大小分日志,之前进行java/python/c#开发时使用日志模块均能按天按大小轮转,glog其实也可以,得稍微改下源码
参考文章
“GOOGLE GLOG 日志使用心得”
2.glog提供了一个程序异常处理机制

3.如何在线通过串口更改日志输出级别

4.如何指定日志输出的串口端口

 参数名为SendToLog的类成员函数指针。这里需要说明的是,其实这个函数指针参数的目的是进行日志输出的操作,但是是可以配置的,因为LogMessage还有另外重载的构造函数其中有这个参数的,只是这里说明的是最简单的情况,所以就考虑了这个函数指针默认为SendToLog的情况,从名字可以猜测到,该函数的作用是向磁盘进行日志输出操作,另外glog中还可以向标准输出进行输出,如果有必要,应该还可以通过网络对某个地址端口进行输出。

windows下如何将printf/cout标准输出重定向到串口,或网络端口socket

5.minGW_32 编译glog库

参考文章:Qt中集成glog(MinGW)

 坑 1:

Scanning dependencies of target glog
[ 5%] Building CXX object CMakeFiles/glog.dir/src/demangle.cc.obj
[ 11%] Building CXX object CMakeFiles/glog.dir/src/logging.cc.obj
[ 17%] Building CXX object CMakeFiles/glog.dir/src/raw_logging.cc.obj
[ 23%] Building CXX object CMakeFiles/glog.dir/src/symbolize.cc.obj
[ 29%] Building CXX object CMakeFiles/glog.dir/src/utilities.cc.obj
[ 35%] Building CXX object CMakeFiles/glog.dir/src/vlog_is_on.cc.obj
[ 41%] Building CXX object CMakeFiles/glog.dir/src/signalhandler.cc.obj
[ 47%] Building CXX object CMakeFiles/glog.dir/src/windows/port.cc.obj
[ 52%] Linking CXX shared library libglog.dll
CMakeFilesglog.dir/objects.a(demangle.cc.obj):demangle.cc:(.text+0x9e): undefined reference to `_imp__UnDecorateSymbolName@16'
CMakeFilesglog.dir/objects.a(symbolize.cc.obj):symbolize.cc:(.text+0x1a0): undefined reference to `_imp__SymFromAddr@20'
CMakeFilesglog.dir/objects.a(symbolize.cc.obj):symbolize.cc:(.text$_ZN6google14SymInitializerC1Ev[__ZN6google14SymInitializerC1Ev]+0x2f): undefined reference to `_imp__SymSetOptions@4'
CMakeFilesglog.dir/objects.a(symbolize.cc.obj):symbolize.cc:(.text$_ZN6google14SymInitializerC1Ev[__ZN6google14SymInitializerC1Ev]+0x51): undefined reference to `_imp__SymInitialize@12'
CMakeFilesglog.dir/objects.a(symbolize.cc.obj):symbolize.cc:(.text$_ZN6google14SymInitializerD1Ev[__ZN6google14SymInitializerD1Ev]+0x12): undefined reference to `_imp__SymCleanup@4'
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [CMakeFilesglog.diruild.make:217: libglog.dll] Error 1
mingw32-make[1]: *** [CMakeFilesMakefile2:940: CMakeFiles/glog.dir/all] Error 2
mingw32-make: *** [Makefile:181: all] Error 2

解决方法:

 可以通过将dbghelp添加为目标库来解决这些问题。 我也不知道为什么我被迫将此包含在Windows中

在CMakeLists.txt中看到有关dbghelp的如下信息:

check_library_exists (dbghelp UnDecorateSymbolName "" HAVE_DBGHELP)

if (WITH_SYMBOLIZE)
if (WIN32 OR CYGWIN)
cmake_push_check_state (RESET)
set (CMAKE_REQUIRED_LIBRARIES DbgHelp)

...

if (HAVE_DBGHELP)
target_link_libraries (glog PUBLIC dbghelp)
endif (HAVE_DBGHELP)

将最后改为:

#if (HAVE_DBGHELP)
target_link_libraries (glog PUBLIC dbghelp)
#endif (HAVE_DBGHELP)

再通过cmake_gui即可生成libglog.dll 库

PS D:GitOpenSourceglog-MinGW> mingw32-make.exe
Scanning dependencies of target glog
[ 5%] Building CXX object CMakeFiles/glog.dir/src/demangle.cc.obj
[ 11%] Building CXX object CMakeFiles/glog.dir/src/logging.cc.obj
[ 17%] Building CXX object CMakeFiles/glog.dir/src/raw_logging.cc.obj
[ 23%] Building CXX object CMakeFiles/glog.dir/src/symbolize.cc.obj
[ 29%] Building CXX object CMakeFiles/glog.dir/src/utilities.cc.obj
[ 35%] Building CXX object CMakeFiles/glog.dir/src/vlog_is_on.cc.obj
[ 41%] Building CXX object CMakeFiles/glog.dir/src/signalhandler.cc.obj
[ 47%] Building CXX object CMakeFiles/glog.dir/src/windows/port.cc.obj
[ 52%] Linking CXX shared library libglog.dll
[ 52%] Built target glog
Scanning dependencies of target utilities_unittest
[ 58%] Building CXX object CMakeFiles/utilities_unittest.dir/src/utilities_unittest.cc.obj
[ 64%] Linking CXX executable utilities_unittest.exe
[ 64%] Built target utilities_unittest
Scanning dependencies of target demangle_unittest
[ 70%] Building CXX object CMakeFiles/demangle_unittest.dir/src/demangle_unittest.cc.obj
[ 76%] Linking CXX executable demangle_unittest.exe
[ 76%] Built target demangle_unittest
Scanning dependencies of target logging_unittest
[ 82%] Building CXX object CMakeFiles/logging_unittest.dir/src/logging_unittest.cc.obj
[ 88%] Linking CXX executable logging_unittest.exe
[ 88%] Built target logging_unittest
Scanning dependencies of target stl_logging_unittest
[ 94%] Building CXX object CMakeFiles/stl_logging_unittest.dir/src/stl_logging_unittest.cc.obj
[100%] Linking CXX executable stl_logging_unittest.exe
[100%] Built target stl_logging_unittest

6. Windows中搭建minGW32编译环境中的时候的坑

参考文章:

1. windows+CMake+mingw 搭建c c++开发环境

2.关于windows下glog日志库使用    (静态库)

WIN10 + Qt 5.14(MSVC 2017,32bit) + APP项目(minGW-7.3.0 32bit)

所以我需要在X86_64bit的机器上用minGW-7.3.0 32bit编译器和相关库编译glog源码,把生成的libglog.dll.a库放到全局库或RobotSchedulerServer能够找到的位置。

step 1:安装cmake-gui

step 2:其实在你安装的Qt目录C:QtQt5.12.7Toolsmingw730_32in下已经有了mingw32-make.exe,你需要将他复制重命名一个make.exe, 否则在step 3会提示

1CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
2CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
3CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
4-- Configuring incomplete, errors occurred!
5See also "D:/tmp/build/CMakeFiles/CMakeOutput.log"

或者也可以,具体可以参考 “Qt中集成glog(MinGW)” 和 windows+CMake+mingw 搭建c c++开发环境

step 3:这一步如果失败,App使用glog函数是会导致链接总是出错。我这里是这样做的:用Qt里面的工具和库来编译生成需要的动态库文件

3.1  src源码CMakelists.txt 中的dbghelp 去掉宏判断,或者添加WIN32 宏不知道行不行,总之就是编译glog源码要动态链接dbghelp.dll库

#if (HAVE_DBGHELP)
target_link_libraries (glog PUBLIC dbghelp)
#endif (HAVE_DBGHELP)

3.2 将Qt的安装目录C:QtQt5.12.7Toolsmingw730_32in 加入环境变量,这里有mingw32-make.exe 和自己生成的make.exe 否则cmake_gui看不到make,生成makefile就会失败

3.3 在cmake_gui中的操作

之后点击generate

我去掉了WITH_GFLAGS 和 WITH_UNWIND否则会有两个警报。

step 4. 打开D:GitOpenSourceglog-MinGW, 在这里运行make,即可生成libglog.dll.a 

step 5. 右键点击Qt上的RobotSchedulerServer工程,添加library

这样就可以了。 再把生成的glog/*.h 文件和config.h文件以及 src/glog/log_serverity.h复制到应用程序的include目录下

另外我发现libwinpthread-1.dll在C:QtQt5.12.75.12.7mingw73_32in,所以是不是在step 2中 重新安装minGW

Threads应该选win32而不是posix?

并且我碰到了一个比较诡异的错误,在Qt IDE中在线调试Debug或者Release版本都没有问题,都可以执行,但我在生成的 

build-GlogTest-Desktop_Qt_5_12_7_MinGW_32_bit-Debug目录下执行.exe文件总是提示:

Qt5GUId.dll 等都提示找不到链接库,我已经将 C:QtQt5.12.75.12.7mingw73_32in 添加到环境变量PATH中了,但还是提示出这些问题。我把C:QtQt5.12.75.12.7mingw73_32in中的dll库放到.exe的同目录build-GlogTest-Desktop_Qt_5_12_7_MinGW_32_bit-Debug

下面还是提示“无法定位程序输入点”,后来才知道 点击.exe 默认的是其他路径下的libstdc++-6.dll,所以这个库也要用C:QtQt5.12.75.12.7mingw73_32in里面的,我不知道为什么我添加了环境变量以后为什么点击.exe还是会链接其他目录下的libstdc++6.dll, 而用Qt Creator在线调试是用的C:QtQt5.12.75.12.7mingw73_32in 这我能想明白,但我不知道为什么添加了环境变量,双击.exe文件却不能用环境变量中的这个库. Anyway, 我最后把新生成的libglog.dll 和C:QtQt5.12.75.12.7mingw73_32in里面的libstdc++-6.dll都复制到了exe所在的build-GlogTest-Desktop_Qt_5_12_7_MinGW_32_bit-Debug目录,C:QtQt5.12.75.12.7mingw73_32in 添加到环境变量PATH中,在双击exe文件就可以顺利执行了。

追了一下明白了一个大概:

搜了一下c盘发现很多地方都有 

我的环境变量包含了Strawberry,所以应该就是这个原因了,qt用的是Strawberry的stdc++库文件,导致动态链接库不可用的。

原文地址:https://www.cnblogs.com/hitzzq/p/13920552.html