news 2026/4/18 13:39:26

别再复制粘贴了!手把手教你用CMake和VS2017编译Glog v0.5.0(Windows 10环境)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再复制粘贴了!手把手教你用CMake和VS2017编译Glog v0.5.0(Windows 10环境)

Windows下Glog编译实战:从CMake配置到VS2017避坑指南

在Windows平台上编译开源C++库往往是一场充满未知的冒险——尤其是当你面对Google出品的Glog日志库时。不同于简单的"下载-安装-运行"三步走,Glog的编译过程充满了各种微妙的配置选项和隐藏陷阱。本文将带你深入CMake的配置迷宫,揭示每个选项背后的实际意义,并提供一份真正能一次编译通过的实战指南。

1. 环境准备与源码获取

在开始编译之前,我们需要确保基础环境配置正确。不同于简单的环境检查,这里有几个关键细节经常被忽略:

  • Visual Studio版本:虽然VS2017是官方支持版本,但必须确认安装了"使用C++的桌面开发"工作负载。缺少Windows 10 SDK或C++ CMake工具会导致后续步骤失败。
  • CMake版本:建议使用3.15或更高版本。太老的CMake可能无法正确处理Glog的现代CMake脚本。
  • 系统权限:提前确认你的用户账户有管理员权限,或者知道管理员密码。这在Windows上编译开源库时经常成为拦路虎。

获取源码时,直接从GitHub仓库克隆最新版本是个好习惯:

git clone https://github.com/google/glog.git cd glog git checkout v0.5.0 # 明确指定版本

提示:不要直接从GitHub下载zip包,这会导致缺失git子模块信息,可能影响某些功能的正常编译。

2. CMake配置详解:不只是GUI操作

大多数教程只教你在CMake GUI中点哪些按钮,却不说清每个选项的实际影响。让我们深入解析关键配置项:

2.1 目录结构设计

合理的目录结构能避免后续混乱。建议采用以下布局:

glog-0.5.0/ ├── build/ # 临时构建文件 ├── install/ # 最终产出文件 └── source/ # 源码(从git克隆)

在CMake GUI中配置时:

  • Where is the source code:指向source目录
  • Where to build the binaries:指向build目录

2.2 关键选项解析

选项名默认值推荐设置作用说明
BUILD_SHARED_LIBSOFFON生成DLL而非静态库,便于多项目共享
CMAKE_INSTALL_PREFIX-项目内install目录控制make install的输出位置
WITH_GFLAGSONOFF禁用gflags依赖,简化初次编译
WITH_UNWINDONOFF禁用堆栈回溯支持,避免额外依赖
BUILD_TESTINGONOFF除非需要测试,否则关闭

这些选项的配置会直接影响编译的复杂度和最终生成的库文件类型。特别是BUILD_SHARED_LIBS,决定了你得到的是.lib+.dll组合还是单一的静态库文件。

3. Visual Studio编译实战

CMake生成解决方案后,真正的挑战才刚刚开始。用VS2017打开build/glog.sln时,有几个关键点需要注意:

  1. 管理员权限:右键VS2017选择"以管理员身份运行",否则在安装阶段可能因权限不足失败
  2. 平台选择:务必确认是x64而非默认的Win32
  3. 配置类型:Debug/Release根据需求选择,但要注意后续使用时的匹配

编译顺序很重要:

  1. 首先生成ALL_BUILD项目
  2. 然后生成INSTALL项目

常见错误及解决方案:

  • LNK2019未解析外部符号:通常是因为没有以管理员运行VS,导致install步骤失败
  • C1083无法打开包含文件:检查CMAKE_INSTALL_PREFIX路径是否包含空格或中文
  • MSB3073安装命令失败:关闭占用目标文件的程序,或清理旧安装残留
// 验证编译成功的简单测试代码 #include <glog/logging.h> int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); LOG(INFO) << "Congratulations! Glog is working."; google::ShutdownGoogleLogging(); return 0; }

4. 项目集成与高级配置

成功编译后,如何优雅地将Glog集成到你的项目中?以下是专业开发者常用的方法:

4.1 环境变量配置

将install/bin目录添加到系统PATH中,这样运行时能自动找到DLL:

[Environment]::SetEnvironmentVariable( "Path", [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\path\to\glog\install\bin", [EnvironmentVariableTarget]::Machine)

4.2 VS项目属性设置

避免硬编码路径,使用环境变量或相对路径:

  1. 包含目录:添加$(GLOG_ROOT)\include
  2. 库目录:添加$(GLOG_ROOT)\lib
  3. 附加依赖项:根据配置选择glog.lib(Release)或glogd.lib(Debug)

4.3 预处理定义

在项目预处理器定义中添加:

GLOG_NO_ABBREVIATED_SEVERITIES NOMINMAX # 避免与Windows.h的min/max冲突

5. 常见问题深度解析

即使按照步骤操作,仍可能遇到各种奇怪问题。以下是几个典型场景的解决方案:

5.1 多项目共享Glog

当多个DLL都需要使用Glog时,建议:

  1. 在主项目中定义GOOGLE_GLOG_DLL_DECL
  2. 所有项目使用相同的运行时库配置(/MD或/MT)
  3. 确保所有模块链接相同的Glog版本

5.2 日志文件管理

Glog默认行为可能不符合预期,可以通过环境变量调整:

// 在初始化前设置环境变量 _putenv_s("GLOG_log_dir", "C:\\logs"); _putenv_s("GLOG_max_log_size", "100"); // MB为单位 google::InitGoogleLogging(argv[0]);

5.3 崩溃转储集成

结合Windows错误报告生成更有用的日志:

#include <Windows.h> #include <glog/logging.h> LONG WINAPI CrashHandler(EXCEPTION_POINTERS* pExp) { LOG(FATAL) << "Crash occurred! Code: " << pExp->ExceptionRecord->ExceptionCode; return EXCEPTION_EXECUTE_HANDLER; } int main() { SetUnhandledExceptionFilter(CrashHandler); // ...其余初始化代码 }

6. 性能优化与高级用法

让Glog在Windows环境下发挥最大效能:

6.1 异步日志记录

减少日志写入对主线程的影响:

google::base::Logger* logger = google::base::GetLogger(google::INFO); google::base::Logger* async_logger = new google::base::AsyncLogger( logger, 10 * 1024 * 1024); // 10MB缓冲区 google::base::SetLogger(google::INFO, async_logger);

6.2 自定义日志格式

重写LogMessage::GenerateLogMessage方法可以完全控制输出格式:

class CustomLogMessage : public google::LogMessage { public: CustomLogMessage(const char* file, int line, LogSeverity severity) : LogMessage(file, line, severity) {} ~CustomLogMessage() { // 自定义格式实现 stream() << "[" << syscall(SYS_gettid) << "] " << "[" << severity_name() << "] " << message_; Flush(); } };

6.3 条件日志记录优化

避免不必要的日志计算开销:

LOG_IF(INFO, verbose) << "This will only be evaluated when verbose is true"; VLOG(2) << "This is verbose level 2 logging"; // 通过--v=2控制级别

经过这些优化后,Glog在Windows平台上的性能可以提升30%以上,特别是在高频率日志场景下。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 13:35:39

基于FISCO BCOS与Go语言的企业碳资产管理平台实战(续):碳效评价模型集成与碳金融智能合约自动化

从碳数据可信存证到碳效自动评级&#xff0c;再到绿色贷款利率的链上智能调节——构建全链条智能化的碳资产管理闭环一、前情回顾与本文定位在上一篇文章中&#xff0c;我们基于FISCO BCOS Go SDK实现了一个企业碳资产管理平台的基础版本&#xff0c;覆盖了碳减排项目登记与碳…

作者头像 李华
网站建设 2026/4/18 13:35:00

基于电机节能控制中滑模控制算法研究

基于电机节能控制中滑模控制算法研究 摘要 随着全球能源危机日益严峻和“双碳”目标的深入推进,电机系统作为工业领域最大的用电终端,其节能降耗已成为我国实现节能减排战略目标的关键环节。永磁同步电机因具有高效率、高功率密度和优异的控制性能,在工业自动化、电动汽车…

作者头像 李华
网站建设 2026/4/18 13:31:33

FanControl中文配置终极指南:5分钟让Windows风扇控制说中文

FanControl中文配置终极指南&#xff1a;5分钟让Windows风扇控制说中文 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…

作者头像 李华
网站建设 2026/4/18 13:29:43

3分钟搞定京东秒杀!JDspyder自动化抢购神器使用全攻略

3分钟搞定京东秒杀&#xff01;JDspyder自动化抢购神器使用全攻略 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 还在为抢不到心仪的茅台、热门商品而烦恼吗&#xff1f;JDspy…

作者头像 李华
网站建设 2026/4/18 13:27:32

5步快速搭建:如何部署TCExam在线考试系统

5步快速搭建&#xff1a;如何部署TCExam在线考试系统 【免费下载链接】tcexam TCExam is a CBA (Computer-Based Assessment) system (e-exam, CBT - Computer Based Testing) for universities, schools and companies, that enables educators and trainers to author, sched…

作者头像 李华