You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下使用FetchContent集成glog遇编译运行问题求助

问题分析与解决

1. CMake阶段依赖警告的处理

glog v0.7.0默认依赖gflags,且会尝试编译自身测试用例(依赖GTest),Unwind是Linux下的调试依赖,Windows完全不需要。你无需额外手动安装或Fetch这些依赖,直接通过CMake选项禁用即可:

在FetchContent_MakeAvailable(glog)之前添加以下配置:

# 禁用gflags依赖
set(WITH_GFLAGS OFF CACHE BOOL "" FORCE)
# 禁用glog测试模块(无需GTest)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
# 禁用Unwind依赖
set(WITH_UNWIND OFF CACHE BOOL "" FORCE)

2. 编译警告与程序崩溃的解决

C4251警告

这个警告的核心是Windows下DLL导出类时,STL成员需要显式的DLL接口。解决关键是让glog和你的项目保持一致的编译链接模式:

  • 静态库模式(推荐):强制glog编译为静态库,同时项目使用静态CRT:
    # 强制编译静态库
    set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
    # 配置静态CRT
    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
    
  • 动态库模式:确保glog和项目都使用动态CRT(/MD或/MDd),glog会自动处理GOOGLE_GLOG_DLL_DECL宏定义。

C4996警告

这是VS对getenv这类“不安全”函数的警告,直接给glog添加编译定义即可消除:

target_compile_definitions(glog PRIVATE _CRT_SECURE_NO_WARNINGS)

程序崩溃问题

崩溃大概率是日志写入权限或动态库查找问题:

  • 如果用动态库编译,确保运行时glog的DLL和exe在同一目录,或者在系统PATH中。
  • Windows下glog默认会尝试写入日志到系统目录(如C:\Windows\System32),普通用户没有权限,需手动指定日志目录:
    ::google::InitGoogleLogging(argv[0]);
    FLAGS_log_dir = "./logs"; // 需提前创建当前目录下的logs文件夹
    LOG(ERROR) << "Test";
    
  • 可以添加崩溃信号捕获,方便排查:
    ::google::InstallFailureSignalHandler();
    

3. 手动编译的错误修正

手动编译时的错误是因为缺少glog的必要宏定义,正确的编译命令(静态链接示例):

cl .\src\Main.cpp /I".\ext\glog\src" /D"GOOGLE_GLOG_DLL_DECL=" /link /LIBPATH:".\ext\glog\build\Release" glog.lib

GOOGLE_GLOG_DLL_DECL=表示静态链接,不需要导出DLL接口。

最终修正后的完整CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(asdf)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 统一静态库+静态CRT配置
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

include(FetchContent)
FetchContent_Declare(
  glog
  GIT_REPOSITORY https://github.com/google/glog.git
  GIT_TAG "v0.7.0"
)

# 配置glog编译选项
set(WITH_GFLAGS OFF CACHE BOOL "" FORCE)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(WITH_UNWIND OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(glog)

# 消除glog的安全函数警告
target_compile_definitions(glog PRIVATE _CRT_SECURE_NO_WARNINGS)

add_executable(main src/Main.cpp)
target_link_libraries(main glog::glog)

内容的提问来源于stack exchange,提问作者Call of Guitar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:39:51