zoukankan      html  css  js  c++  java
  • 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++库文件,导致动态链接库不可用的。

  • 相关阅读:
    藏!Java编程技巧之单元测试用例编写流程 原创 常意 阿里技术 2021-05-12
    时间,遵循rfc3339标准格式 unix时间戳
    微软面试题: LeetCode 240. 搜索二维矩阵 II 出现次数:3
    微软面试题: LeetCode 69. x 的平方根 出现次数:3
    微软面试题: LeetCode 138. 复制带随机指针的链表 出现次数:3
    微软面试题: LeetCode 384. 打乱数组 出现次数:3
    微软面试题: LeetCode 207. 课程表 出现次数:3
    微软面试题: LeetCode 98. 验证二叉搜索树 出现次数:3
    CF1537E2 Erase and Extend (Hard Version) 题解
    洛谷 P4332 [SHOI2014]三叉神经树 题解
  • 原文地址:https://www.cnblogs.com/hitzzq/p/13920552.html
Copyright © 2011-2022 走看看