Qt中集成glog(MinGW)

引言

 上篇文中说到windows下使用glog,不过我的实际需求是windows下在Qt中集成glog,实践下来发现区别还是很大的。这边记录下过程,防止更多人踩坑。

过程

  1. 我的开发环境,Qt工具链
     Qt版本 5.13.0
     MinGW版本7.3.0(x64-posix-seh-rev0) 内含GCC/G++ 64bit/7.3.0
  2. MinGW环境
     首先需要安装MinGW环境(其实Qt中内置了各种编译工具,包括MinGW,理论上可以将Qt目录下tools包中MinGW配置到环境变量,然后生成环境),不过我没实践过。
     这边给下MinGW链接,我用的是下面1中的MinGW-W64-install.exe安装包,
    链接: MinGW下载1
    链接: MinGW下载2
     下载完安装,打开后按如下配置,MinGW配置
    Note: 上图配置,尽量和你的Qt工程对应。
  3. CMake(上篇文中有链接和说明)
    CMake图形工具打开glog工程,CMake
    选好glog目录和生成工程目录后,点击configure选择生成器类型(generator type),类型也是需要和你Qt工程编译工具链对应的。下面编译器选择,因为安装了MinGW环境,所以选择默认本地编译器,它可以根据CMakelist.txt和你的环境检测配置生成工程及配置项(你也可以,自己指定编译器,但是我在没有安装环境时,直接指定了Qt tools中的编译包生成失败了)。之后自动在你指定的生成目录下生成工程相关文件。接着点击Generate,生成目录下会生成makefile,有了makefile下一步可以编译了。
  4. 编译
    命令行进入到生成工程的目录下,我上面是glog/glog-MinGW。
    dos中键入mingw32-make,就会根据生成的makefile编译工程了(如果你环境中没有配置MinGW,将会查不到该命令)。成功编译,如下图。
    compile
    此时你可以从目录下取得libglog.a,和生成的环境相关头文件添加到Qt工程中使用了。
    Note: 默认生成的库libglog.a是静态库 ,而glog生成的几个头文件中,在windows平台下默认调用是动态库调用,所以你需要将头文件中的 __declspec(dllimport) 去掉,否则程序会强制去动态库寻找,而报错找不到符号。还有因为libglog.a内有一部分代码是调用系统库,就像下图,所以Qt链接静态库集成的时候,还需要链接一个dbghelp.lib系统库,程序才能编译通过。
    symbol
    以上两种情况对应的错误分别是
    undefined reference to `__imp__ZN6google17InitGoogleLoggingEPKc’
    undefined reference to `__imp_SymFromAddr’

当然,更简单地方法就是指定生成动态库,这样在就不会存在上述问题。按下图,
shared
在cmake生成工程配置的时候将BUILD_SHARED_LIBS勾上,重新配置项。再编译一遍,目录下就会生成libglog.dll和libglog.dll.a(类似.lib)两个库。Qt工程中链接libglog.dll.a,即可正常编译运行。

  1. 集成到Qt
    将生成工程目录下的glog文件夹以及下面的文件和config.h以及glog-master\src\glog目录下的log_severity.h添加到Qt工程,
    glog-mingw
    glog-master
    再将动态库链接到工程,
    adddll
    测试代码如下,
#include "mainwindow.h"
#include <QApplication>
#include "config.h"
#include "glog/logging.h"

using namespace GOOGLE_NAMESPACE;
int main(int argc, char *argv[])
{
    InitGoogleLogging(argv[0]);
    FLAGS_log_dir = "./";
    LOG(INFO)<<"THIS IS A INFO";
    LOG(INFO)<<"INFO 2";

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Note: 当你工程中,涉及windows平台环境时,可能会报错宏冲突,此时需要声明宏GLOG_NO_ABBREVIATED_SEVERITIES,使得ERROR等宏展开全名,而消除与windows下的ERROR宏冲突。
运行结果,
结果
jg2

总结

 通过Qt中集成glog,也算把windows下使用开源工程的基本操作和常用工具链熟悉了下。

发布了60 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/BadAyase/article/details/103599174