使用CMake通过FetchContent引入gtest时如何正确指定编译器?
问题原因
CMAKE_CXX_COMPILER 属于CMake首次配置阶段就会固定的基础环境变量,你在CMakeLists中通过set强制修改缓存中的该变量,会触发CMake判定缓存失效,自动重启配置流程,而重启时你之前传入的自定义参数(比如示例中的SPI_MODE)会丢失,进而导致配置失败。
正确解决方案
方案一(推荐):全项目统一指定编译器
不要在CMakeLists中硬编码编译器路径,编译器属于环境配置,应该在首次执行CMake配置命令时通过参数指定,示例命令如下:
cmake /path/to/src \ -DCMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabihf-g++ \ -DCMAKE_C_COMPILER=/usr/bin/arm-linux-gnueabihf-gcc \ -DSPI_MODE=asic
这种方式下,包括FetchContent拉取的gtest在内的所有项目组件都会统一使用指定的编译器,不会出现缓存冲突问题,也符合CMake的最佳实践。
方案二:单独为gtest指定编译器
如果确实需要gtest使用和主项目不同的编译器,可以在FetchContent声明时单独给gtest子项目传递编译参数,不要修改全局的编译器变量,示例代码如下:
include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/release-1.11.0.zip # 仅给gtest子项目传递编译器参数 CMAKE_ARGS -DCMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabihf-g++ -DCMAKE_C_COMPILER=/usr/bin/arm-linux-gnueabihf-gcc ) # 可选配置:避免运行时库编译选项冲突,全平台都建议添加 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) include(GoogleTest)
注意:如果主项目和gtest使用不同编译器,请确保两者的ABI兼容,否则会出现链接或运行时异常。
内容的提问来源于stack exchange,提问作者UdiM
相关产品推荐
相关产品推荐

