使用CMake和MinGW MSYS2编译GoogleTest遇错求助
MinGW MSYS2下GoogleTest编译错误的解决方法
一、官方FetchContent方式出现fileno/strdup等函数未定义的问题
这是因为MinGW默认未启用POSIX兼容宏,这些函数属于POSIX标准而非C标准库,编译时需要手动指定兼容宏:
- 在你的CMakeLists.txt中,给gtest相关目标添加编译定义:
# 如果用FetchContent拉取gtest,添加以下配置 FetchContent_MakeAvailable(gtest) target_compile_definitions(gtest PRIVATE _POSIX_C_SOURCE=200809L _GNU_SOURCE) target_compile_definitions(gtest_main PRIVATE _POSIX_C_SOURCE=200809L _GNU_SOURCE) - 同时确保你用的是MSYS2的mingw64 shell(不是msys shell),工具链要对应MinGW环境。
二、用pacman安装后找不到gtest/gtest.h的问题
你误用了find_library,它只负责查找库文件,不会处理头文件路径和依赖配置。正确做法是用find_package导入gtest的CMake配置:
- 替换原有
find_library代码为:find_package(GTest REQUIRED) - 链接测试目标时,直接使用官方提供的导入目标:
add_executable(your_test your_test.cpp) target_link_libraries(your_test PRIVATE GTest::gtest GTest::gtest_main)
这样CMake会自动处理头文件包含路径、库文件路径以及依赖项,无需手动指定。
额外注意事项
- 确保安装的是对应架构的gtest包:你用的是
mingw-w64-x86_64-gtest,就要在mingw64环境下操作,不要混用到msys环境。 - 验证CMake工具是MinGW版本:执行
cmake --version,确认输出里包含mingw-w64字样,避免用错系统自带的CMake。
内容的提问来源于stack exchange,提问作者flori10
相关产品推荐
相关产品推荐

