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编译的,就会导致链接时符号不匹配:
- 拉取gflags源码;
- 用相同的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
相关产品推荐
相关产品推荐

