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

Windows下使用CMake编译Google glog失败求助

解决Windows 10下Qt 5.10 + MinGW编译glog源码的报错问题

我之前在MinGW环境下编译glog也碰到过类似的中途报错情况,结合你已经启用CMAKE_WINDOWS_EXPORT_ALL_SYMBOL的前提,大概率是MinGW兼容性、gflags编译匹配度或者编译选项细节的问题,给你几个针对性的解决步骤:

1. 确保MinGW版本与Qt环境一致且适配glog

Qt 5.10默认搭配的是MinGW 5.3.0,但这个版本对C++11的支持不够完善,glog的部分源码可能会出现编译问题。建议你:

  • 换成mingw-w64 8.1.0及以上版本(32/64位根据你的Qt项目架构选择),确保和Qt项目使用的MinGW是同一个(可以在Qt Creator的「工具->选项->构建和运行」里查看当前MinGW路径);
  • 避免使用老旧的MinGW分支,比如部分旧版TDM-GCC可能存在符号导出的兼容问题。

2. 重新编译gflags(必须和glog用相同的MinGW)

你提到gflags路径设置正确,但如果gflags是预编译的MSVC版本,或者用不同的MinGW编译的,就会导致链接时符号不匹配:

  1. 拉取gflags源码;
  2. 用相同的MinGW+CMake编译,命令参考:
mkdir gflags-build && cd gflags-build
cmake .. -G "MinGW Makefiles" ^
  -DCMAKE_INSTALL_PREFIX=C:/your/install/path/gflags ^
  -DBUILD_SHARED_LIBS=OFF ^  # 优先编译静态库,避免导出符号问题
  -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON ^
  -DCMAKE_CXX_FLAGS="-std=c++11"
mingw32-make
mingw32-make install

注意:如果要编译动态库,必须确保gflags和glog的BUILD_SHARED_LIBS设置完全一致。

3. 调整glog的CMake编译选项

针对MinGW环境,添加这些关键选项可以解决大部分编译/链接问题:

mkdir glog-build && cd glog-build
cmake .. -G "MinGW Makefiles" ^
  -DCMAKE_INSTALL_PREFIX=C:/your/install/path/glog ^
  -DBUILD_SHARED_LIBS=OFF ^
  -DWITH_GFLAGS=ON ^
  -DGFLAGS_INCLUDE_DIR=C:/your/install/path/gflags/include ^
  -DGFLAGS_LIBRARY=C:/your/install/path/gflags/lib/libgflags.a ^
  -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON ^
  -DCMAKE_CXX_FLAGS="-std=c++11 -D_WIN32_WINNT=0x0601" ^  # 指定Windows API版本,避免冲突
  -DCMAKE_EXE_LINKER_FLAGS="-static-libgcc -static-libstdc++" ^  # 静态链接标准库
  -DWITH_UNWIND=OFF ^  # MinGW下unwind特性可能引发编译错误
  -DWITH_THREADS=ON
mingw32-make

解释:

  • -D_WIN32_WINNT=0x0601:对应Windows 7版本,避免glog中Windows API调用的版本不兼容;
  • -DWITH_UNWIND=OFF:禁用unwind(用于栈回溯),MinGW对这个特性的支持不如MSVC;
  • 静态库模式下,导出符号的问题会被大幅简化,适合Qt项目快速集成。

4. 排查具体报错信息(关键!)

你只提到进度到64%停止报错,建议你把编译时的具体错误信息贴出来,比如:

  • 如果是undefined reference to gflags::XXX:说明gflags的库没正确链接,或者编译方式不匹配;
  • 如果是编译时的语法错误:比如error: 'xxx' was not declared in this scope,可能是MinGW对C++标准的支持问题,需要调整CMAKE_CXX_FLAGS;
  • 如果是符号导出错误:比如undefined reference to __imp_XXX,说明动态库的导出符号未正确生成,此时建议切换到静态库编译。

5. 手动适配glog源码(针对极端情况)

如果上述步骤都无效,可能是glog源码中MinGW的适配问题,你可以修改glog/logging.h中的导出宏定义:

// 找到GLOG_EXPORT的定义,替换为:
#if defined(_MSC_VER)
#  define GLOG_EXPORT __declspec(dllexport)
#elif defined(__GNUC__) && defined(BUILDING_GLOG)
#  define GLOG_EXPORT __attribute__((visibility("default")))
#else
#  define GLOG_EXPORT
#endif

这个修改可以确保MinGW下动态库的符号正确导出。

6. 在Qt项目中链接glog

编译完成后,在Qt项目的CMakeLists.txt中添加:

set(glog_DIR C:/your/install/path/glog/lib/cmake/glog)
set(gflags_DIR C:/your/install/path/gflags/lib/cmake/gflags)
find_package(glog REQUIRED)
find_package(gflags REQUIRED)

target_link_libraries(YourQtProjectName PRIVATE glog::glog gflags::gflags)

内容的提问来源于stack exchange,提问作者golden96371

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:10:49