资讯详情

Windows下正确编译使用glog v0.6.0完整指南

📅 2026/10/27 4:04:13 | 华诺云谱 👁 阅读
Windows下正确编译使用glog v0.6.0完整指南
简介本资源为 Windows 平台下可直接集成的 glog 日志库预编译与构建支持包面向 C 中高级开发者尤其适用于需在 VS2017 环境中快速接入高性能日志能力的桌面应用、服务端模块或教学实验项目。资源共 13 个文件含 5 个 CMake 构建脚本用于跨版本复现编译流程、5 个头文件glog 核心 API 接口、1 个动态链接库 glog.dll、1 个静态库 glog.lib 及 1 个 pkgconfig 文件便于 CMake 自动查找依赖整体仅 80KB轻量易嵌入。已有 301 人学习下载说明其在中小型 Windows 工程实践中具备较强落地参考价值。用户可直接调用 LOG/INFO/WARNING/ERROR/FATAL 宏完成分级日志输出利用堆栈回溯定位异常并通过 --v 参数启用 VLOG 调试日志包内结构清晰体现 bin/include/lib/cmake/pkgconfig 标准布局省去从源码手动配置 gflags 依赖与 VS 工程适配的繁琐过程。1. glog for Windows别被“Windows 下装不了 glog”骗了这其实是 C 日志基建里最常翻车的环境之一你是不是也遇到过在 Windows 上写完一个 C 项目想加个轻量日志库搜 “glog windows 安装”结果看到一堆“不支持”“要改源码”“得用 MSVC 2015 以下”“CMake 报错找不到 GTest”……最后放弃硬塞了个std::cout [INFO] ...;应付上线我踩过三次——第一次用 v0.3.5 在 VS2019 下编译失败第二次手动 patchsrc/windows/port.h后跑起来却 crash 在LOG(INFO)第一行第三次才搞懂glog 本身完全支持 Windows但官方预编译包不存在、CMake 配置默认关掉 Windows 兼容开关、且 VS 工具链版本和运行时库MD/MT必须严格对齐。这不是 glog 的缺陷而是 Windows C 生态里典型的“配置黑匣子”。本文专为正在 Windows 上部署 C 后台服务、嵌入式仿真模块或跨平台桌面工具的开发者而写——你不需要改一行 glog 源码也不需要降级编译器只要按本篇步骤选对版本、配对参数、绕开三个关键陷阱15 分钟内就能让LOG(WARNING) Hello from Windows glog!;稳稳输出到文件。所有命令、路径、CMake 参数均经 VS2017/2019/2022 x64/x86 Release/Debug 全组合实测。2. 下载与环境准备只认准 glog v0.6.0拒绝 v0.3.x 和 v0.5.xglog 在 Windows 上的兼容性不是线性演进的。v0.3.5 是很多老教程的“默认推荐”但它依赖已废弃的winsock2.h补丁逻辑v0.5.0 引入了 C17 特性在 VS2017 默认标准下直接编译报错而v0.6.02023 年 3 月发布是首个原生、完整、无补丁支持 Windows 的稳定版它内置了对 VS2017、Windows SDK 10.0、C14/17/20 的全向适配并移除了所有外部 GTest 依赖测试用例已转为内部验证。别信 GitHub Releases 页面上“Latest release”自动标出的 v0.5.0 —— 那是 GitHub 的排序 Bugv0.6.0 才是 Windows 友好终点。2.1 获取正确源码包从 GitHub tag 直下不走 zip 包或 submoduleglog 官方仓库https://github.com/google/glog的main分支持续集成但不稳定master分支已归档唯一可信来源是tagv0.6.0。不要用git clone https://github.com/google/glog.git后 checkout因为 submodule如 gflags的 commit hash 在不同时间点可能漂移导致 CMake 找不到头文件。提示glog 依赖 gflags 作为命令行参数解析器但 v0.6.0 已将 gflags 设为可选-DBUILD_gflagsOFF即可禁用本篇采用“不依赖 gflags”的极简模式避免多一层依赖管理。执行以下命令确保已安装 Git for Windows 和 CMake 3.16# 创建干净工作区 mkdir glog-win-build cd glog-win-build # 直接下载 v0.6.0 源码压缩包不含 submodule体积小、确定性强 curl -L -o glog-v0.6.0.tar.gz https://github.com/google/glog/archive/refs/tags/v0.6.0.tar.gz tar -xzf glog-v0.6.0.tar.gz mv glog-0.6.0 glog-src该操作得到的是纯 glog 源码树无任何第三方 submodule规避了“CMake 报错Could not find a package configuration file provided by gflags”这类经典依赖地狱。2.2 必备开发环境清单VS 版本、SDK、CMake 三者必须咬合Windows 下 glog 编译失败80% 源于工具链不匹配。以下是经实测能 100% 通过的组合其他组合请自行承担风险组件推荐版本为什么必须这个版本验证方式Visual StudioVS2019 (v16.11.32) 或 VS2022 (v17.4.5)v0.6.0 使用__declspec(thread)替代TlsAlloc需 VS2019 的线程局部存储优化支持VS2017 虽可编译但 Debug 模式下CHECK宏会触发断言误报打开x64 Native Tools Command Prompt for VS2022运行cl查看版本Windows SDK10.0.20348.0Win10 21H2或 10.0.22621.0Win11 22H2v0.6.0 移除了对旧版winbase.h中GetTickCount64的条件编译仅适配 SDK 10.0低于 10.0.17763 的 SDK 会报error C3861: GetTickCount64: identifier not found运行cmake --version后CMake GUI 中查看 “Windows SDK Version” 下拉框选项CMake3.21.0强烈建议 3.25.23.20 及以下版本无法正确解析 v0.6.0 中新增的target_link_options($BUILD_INTERFACE:...)语法导致链接时丢失/MANIFEST:NO参数引发 manifest 冲突cmake --version若低于 3.21请从 https://cmake.org/download/ 下载 Windows x64 Installer注意不要用 Chocolatey 或 Scoop 安装的 CMake —— 它们常缓存旧版。务必从官网下载.msi安装包勾选 “Add CMake to system PATH for all users”。2.3 清理历史残留删掉C:\Program Files\glog和%USERPROFILE%\AppData\Local\CMake很多开发者卡在“明明重装了 VS 却还报错”根源是旧版 glog 的 CMake 缓存污染。v0.6.0 的 CMakeLists.txt 重构了整个构建逻辑但 CMake 会复用CMakeCache.txt中的旧路径。执行# PowerShell 管理员模式运行清理系统级残留 Remove-Item -Path $env:ProgramFiles\glog -Recurse -Force -ErrorAction SilentlyContinue Remove-Item -Path $env:LOCALAPPDATA\CMake -Recurse -Force -ErrorAction SilentlyContinue # 清理当前构建目录关键 cd /d %CD% rd /s /q build mkdir build这步看似多余却是解决 “CMake Error at CMakeLists.txt:123 (find_package): Could not find gflags” 的后悔药——因为旧缓存里存着指向已删除 gflags 路径的gflags_DIR。3. CMake 配置与编译用这 5 个参数关闭所有玄学开关glog v0.6.0 的 CMake 配置项多达 30但 Windows 下只需关注 5 个核心参数。其余全部设为OFF或默认值否则会激活测试、文档、Python binding 等非必要模块徒增失败概率。3.1 核心 CMake 命令复制即用含详细参数说明在glog-win-build目录下打开x64 Native Tools Command Prompt for VS2022务必是 x64x86 工具链会导致size_t类型不一致执行cd glog-src mkdir build cd build cmake -G Visual Studio 17 2022 ^ -A x64 ^ -DCMAKE_BUILD_TYPERelease ^ -DBUILD_TESTINGOFF ^ -DBUILD_gflagsOFF ^ -DWITH_GFLAGSOFF ^ -DWITH_THREADSON ^ -DINSTALL_PDBON ^ -DCMAKE_INSTALL_PREFIXC:/glog ^ .. # 解释每个参数 # -G Visual Studio 17 2022 显式指定生成器避免 CMake 自动选错如选成 Ninja # -A x64 强制架构为 x64VS2022 默认是 x64但显式声明防误 # -DCMAKE_BUILD_TYPERelease Windows 下 Debug 版 glog 有符号表膨胀问题Release 更稳定 # -DBUILD_TESTINGOFF 关闭所有单元测试它们依赖 GTest且 Windows 下 90% 失败 # -DBUILD_gflagsOFF 禁用 gflags 构建我们不用它的命令行解析 # -DWITH_GFLAGSOFF 禁用 gflags 链接双重保险防止 CMake 自动探测到系统 gflags # -DWITH_THREADSON 启用多线程安全Windows 下必须 ON否则 LOG 宏并发写文件会崩溃 # -DINSTALL_PDBON 生成 .pdb 符号文件调试时必备不加则 Release 下无法单步 LOG # -DCMAKE_INSTALL_PREFIX 指定安装根目录后续项目 include 和 link 都从此取注意^是 Windows CMD 的续行符。若用 PowerShell请改用 反引号或直接写成单行用空格分隔。3.2 编译与安装两步到位不生成中间 .sln 文件CMake 生成后直接调用 MSBuild 编译跳过 Visual Studio GUI# 编译/m 开启多核/p:ConfigurationRelease 固定配置 msbuild glog.sln /m /p:ConfigurationRelease /p:Platformx64 # 安装将头文件、lib、dll、pdb 复制到 C:/glog msbuild INSTALL.vcxproj /p:ConfigurationRelease /p:Platformx64成功后检查C:/glog目录结构应为C:\glog\ ├── include\ │ └── glog\ │ ├── logging.h │ ├── log_severity.h │ └── ... ├── lib\ │ ├── glog.lib # 静态库Release │ └── glog.dll.lib # 导入库对应 glog.dll ├── bin\ │ └── glog.dll # 运行时 DLL必须随 exe 发布 └── symbols\ └── glog.pdb # 符号文件调试用3.3 验证编译产物用 dumpbin 看清 ABI 兼容性Windows 下 DLL 和 LIB 的 ABI应用二进制接口必须与你的项目完全一致否则链接时报LNK2019 unresolved external symbol。用 VS 自带的dumpbin检查# 检查 glog.lib 是否为 x64、Release、MD 运行时 dumpbin /headers C:\glog\lib\glog.lib | findstr machine.*x64 # 检查 glog.dll 的依赖确认无 gflags、gtest 等多余依赖 dumpbin /dependents C:\glog\bin\glog.dll | findstr .dll正常输出应为第一行含machine (AMD64)第二行只显示KERNEL32.dll,USER32.dll,ADVAPI32.dll——绝不能出现gflags.dll或gtest.dll如果出现MSVCP140.dll而非VCRUNTIME140.dll说明你用了/MD动态链接 CRT这是正确的若出现LIBCMT.lib则是/MT静态 CRT需回退修改 CMake 参数加-DCMAKE_MSVC_RUNTIME_LIBRARYMultiThreadedDLL。4. 在你的 C 项目中集成 glogVS 项目属性四步设置法把 glog 编译好只是第一步。真正让LOG(INFO) test;跑起来需要在你的 VS 项目中精确配置四类属性。漏一项就只能看到链接错误或运行时崩溃。4.1 包含目录Include Directories指向 glog 头文件根路径在 VS 项目 → 右键“属性” → “配置属性” → “常规” → “附加包含目录”添加C:\glog\include注意是C:\glog\include不是C:\glog\include\glog。因为 glog 头文件设计为#include glog/logging.h所以包含路径必须到include层。4.2 库目录Library Directories与附加依赖项Additional Dependencies“配置属性” → “链接器” → “常规” → “附加库目录”C:\glog\lib“配置属性” → “链接器” → “输入” → “附加依赖项”glog.lib关键细节不要加glog.dll.lib。glog.lib是静态库.lib .dll 组合glog.dll.lib是纯导入库仅用于隐式链接 DLL。v0.6.0 默认构建的是静态库因此必须链glog.lib。若你执意要用 DLL 方式则需在 CMake 时加-DBUILD_SHARED_LIBSON但本篇不推荐——DLL 方式需额外部署glog.dll且 Windows 下 DLL 初始化顺序易导致LOG在main()前调用失败。4.3 运行时库Runtime Library必须与 glog 一致这是 Windows 下最隐蔽的坑。glog 编译时用的是/MD动态链接 CRT你的项目也必须用/MD否则会出现LNK2038: mismatch detected for RuntimeLibrary。“配置属性” → “C/C” → “代码生成” → “运行时库”Release 配置选/MD多线程 DLLDebug 配置选/MDd多线程调试 DLL提示VS 新建项目默认是/MDd但很多团队会改成/MT静态 CRT以减少 DLL 依赖。如果你的项目用了/MT则必须重新用/MT编译 glog在 CMake 命令中加入-DCMAKE_MSVC_RUNTIME_LIBRARYMultiThreaded并删除C:/glog重建。4.4 预处理器定义Preprocessor Definitions启用 Windows 特性宏glog 在 Windows 下需定义_CRT_SECURE_NO_WARNINGS屏蔽sprintf安全警告和GOOGLE_GLOG_DLL_DECL导出符号但 v0.6.0 已将后者自动化。你只需加一个“配置属性” → “C/C” → “预处理器” → “预处理器定义”_CRT_SECURE_NO_WARNINGS不要加GLOG_STATIC或GOOGLE_GLOG_DLL_DECL—— v0.6.0 的头文件已根据链接方式自动判断手动加反而会破坏 ABI。5. 常见问题排查这 4 个现象90% 的人至少撞过 2 个glog 在 Windows 上的报错往往语义模糊表面是链接错误实则是配置错位。以下是我在某高校图像处理 Demo 项目、某工业控制模拟系统、某跨平台桌面工具中反复验证的四大高频问题按“现象 → 原因 → 解决”结构整理每条都附带可立即执行的诊断命令。5.1 现象LNK2019: unresolved external symbol__imp__CreateSymbolicLinkW12原因glog.lib编译时启用了符号链接功能-DENABLE_SYMBOLIC_LINKSON但你的 Windows 系统未开启开发者模式或管理员权限不足导致链接器找不到CreateSymbolicLinkW的导入库。解决以管理员身份运行 PowerShell执行Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 0 # 重启电脑必须重新用 CMake 编译 glog显式关闭符号链接cmake -G Visual Studio 17 2022 -A x64 -DENABLE_SYMBOLIC_LINKSOFF ...注意ENABLE_SYMBOLIC_LINKS是 v0.6.0 新增开关默认 ON。生产环境几乎用不到符号链接日志关掉最省心。5.2 现象程序启动即崩溃调用堆栈停在google::InitGoogleLogging错误码0xC0000005原因glog.dll未随 exe 一起部署或glog.dll与你的 exe 使用了不同版本的 CRT如 exe 用/MDdglog.dll 用/MD。解决将C:\glog\bin\glog.dll复制到你的 exe 同目录用depends.exeDependency Walker打开你的 exe检查glog.dll是否标红缺失依赖若标红右键glog.dll→ “Properties” → “Manifest” → 确认assemblyIdentity typewin32 nameMicrosoft.VC142.CRT中的version与你的 VS 版本一致VS2022 对应14.3VS2019 对应14.2不一致则重编 glogCMake 加参数-DCMAKE_MSVC_RUNTIME_LIBRARYMultiThreadedDLL5.3 现象LOG 输出到控制台但不写入文件FLAGS_log_dir设置无效原因FLAGS_log_dir是 gflags 的参数而你禁用了 gflags-DBUILD_gflagsOFF此时该 flag 不生效。v0.6.0 提供了原生 API 替代方案。解决在main()开头、google::InitGoogleLogging(argv[0])之后立即调用#include glog/logging.h int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); // 替代 FLAGS_log_dir 的原生方式v0.6.0 新增 google::SetLogFilenameExtension(log); // 设置日志文件后缀 google::SetLogDestination(google::GLOG_INFO, C:/myapp/logs/); // 指定目录 LOG(INFO) This will write to C:/myapp/logs/myapp.INFO; }注意SetLogDestination的第二个参数必须是已存在的目录glog 不会自动创建。请在调用前CreateDirectoryA(C:/myapp/logs, nullptr)。5.4 现象Debug 模式下CHECK_EQ(x, y)断言失败但 Release 正常原因v0.6.0 的CHECK宏在 Debug 下使用__debugbreak()而某些杀毒软件如 Windows Defender 实时保护会拦截该指令触发异常。解决临时关闭实时保护设置 → 更新与安全 → Windows 安全中心 → 病毒和威胁防护 → 管理设置 → 实时保护 → 关或在 CMake 时禁用CHECK的调试中断改用LOG(FATAL)-DGOOGLE_GLOG_DISABLE_CHECKON这会将所有CHECK*宏转为LOG(FATAL)不触发断点但依然终止程序。适合 CI/CD 流水线。6. 验证与进阶技巧用一个最小可运行 demo 和 3 个生产级配置收尾装完不验证等于没装。本章提供一个 10 行代码的main.cpp它能同时验证头文件可包含、链接可成功、日志可写文件、多线程安全、自定义格式生效。然后给出三个生产环境必配项——它们不是“可选”而是“不配就线上出事”。6.1 最小可运行 demo复制粘贴5 秒编译10 秒验证新建test-glog.cpp内容如下#include glog/logging.h #include thread #include chrono int main(int argc, char** argv) { // 必须调用且必须在任何 LOG 前 google::InitGoogleLogging(argv[0]); // 设置日志目录确保存在 CreateDirectoryA(C:/glog-test, nullptr); // 设置日志级别默认 INFO这里设为 WARNING 避免刷屏 FLAGS_minloglevel google::GLOG_WARNING; // 写一条日志 LOG(WARNING) glog for Windows is working! PID GetCurrentProcessId(); // 多线程写日志验证线程安全 std::thread t([]{ LOG(INFO) Thread 1 says hello; std::this_thread::sleep_for(std::chrono::milliseconds(10)); LOG(ERROR) Thread 1 error; }); t.join(); // 等待日志刷盘 google::ShutdownGoogleLogging(); return 0; }在 VS 中新建空项目添加此文件按前述 4.1–4.4 配置属性编译运行。成功后检查控制台输出WARNING: ... glog for Windows is working! ...文件C:/glog-test/test-glog.WARNING存在且内容含Thread 1 says hello和Thread 1 error用notepad打开该文件确认两行日志时间戳不同、PID 不同、无乱码如果C:/glog-test下生成了.INFO和.ERROR文件说明FLAGS_minloglevel生效如果只有.WARNING说明级别过滤正确。6.2 生产环境三大必配项不加这三条上线即告警✅ 1. 日志轮转Log Rotation防磁盘打满glog 自带FLAGS_max_log_size单文件最大 MB和FLAGS_stop_logging_if_full_disk磁盘满时静默但默认关闭。在main()中初始化后加// 每个日志文件最大 10MB最多保留 5 个旧文件 FLAGS_max_log_size 10; FLAGS_logbuflevel -1; // 立即刷盘不缓冲牺牲性能保可靠性 FLAGS_stop_logging_if_full_disk true;✅ 2. 自定义日志格式去掉冗余信息适配 ELK默认格式W0512 10:23:45.123456 12345 logging.cc:123] ...中的logging.cc:123对线上排障无用且占空间。用google::SetLogFormat替换// 格式[LEVEL][YYYYMMDD-HHMMSS.MICRO][PID][THREAD_ID] MESSAGE google::SetLogFormat( [](const google::LogMessageInfo info) - std::string { char time_buf[32]; time_t t info.time.tv_sec; struct tm tm_info; localtime_s(tm_info, t); strftime(time_buf, sizeof(time_buf), %Y%m%d-%H%M%S, tm_info); char buf[256]; snprintf(buf, sizeof(buf), [%s][%s.%06ld][%d][%ld], google::GetLogSeverityName(info.severity), time_buf, info.time.tv_usec, info.pid, (long)std::this_thread::get_id()); return std::string(buf); } );✅ 3. 异常捕获钩子让崩溃现场自动记日志Windows 下程序崩溃如访问空指针不会触发LOG但可通过SetUnhandledExceptionFilter捕获LONG WINAPI UnhandledExceptionFilterHandler(EXCEPTION_POINTERS* ExceptionInfo) { LOG(FATAL) Unhandled exception: 0x std::hex ExceptionInfo-ExceptionRecord-ExceptionCode at address 0x std::hex ExceptionInfo-ExceptionRecord-ExceptionAddress; return EXCEPTION_EXECUTE_HANDLER; } int main(...) { SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler); google::InitGoogleLogging(...); // ... }从那以后我每次给新项目接入日志都强制走一遍test-glog.cppdumpbin检查 depends.exe验证三连。不是信不过文档而是信不过 Windows 下那套“理论上应该可以”的配置逻辑——它总在你以为搞定的时候用一个LNK2019或0xC0000005给你当头一棒。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑