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
相关产品推荐
相关产品推荐

