Conan 2.x+CMake集成GTest时头文件找不到的问题排查
针对你遇到的编译错误gtest/gtest.h: No such file or directory,大概率是CMake配置未正确关联GTest的依赖路径,以下是具体排查和修复方案:
1. 确保测试目标正确链接GTest的CMake目标
CMake通过target_link_libraries绑定GTest目标时,会自动将GTest的头文件、库文件路径注入到测试项目中。如果仅执行find_package但未正确链接目标,测试代码无法找到头文件。
修改tests目录下的CMakeLists.txt:
# 查找GTest(包含gtest_main组件) find_package(GTest REQUIRED COMPONENTS gtest_main) # 创建测试可执行文件 add_executable(TestThread TestThread.cpp) # 链接GTest目标与你的项目静态库 target_link_libraries(TestThread PRIVATE gtest::gtest gtest::gtest_main # 替换为你根目录生成的静态库目标名称,例如:sl_common_utils )
2. 检查根目录CMake的子目录加载时机
如果根目录CMakeLists.txt是在add_subdirectory(tests)之后才处理Conan相关配置,子目录的find_package会无法定位到GTest的配置文件。确保在add_subdirectory(tests)之前,Conan的toolchain和依赖配置已被加载(你通过cmake命令指定CMAKE_TOOLCHAIN_FILE的方式是正确的,此步骤主要确认子目录加载顺序)。
3. 验证Conan生成的配置文件是否被加载
在build目录中检查是否存在cmake文件夹(内含GTest的Config配置文件),如果CMake未自动识别该路径,可在根目录CMakeLists.txt的project()指令前手动添加:
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/cmake")
也可以通过debug参数查看find_package的搜索过程:
cmake .. -G "Visual Studio 17 2022" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DSL_WITH_TESTS=On --debug-find
查看输出中是否包含Conan生成的GTest配置路径,若没有则重新执行Conan安装:
conan install . --output-folder=build --build=missing --profile:host=vs2022
(若没有vs2022的profile,先执行conan profile new vs2022 --detect生成)
4. 手动验证项目包含路径
打开Visual Studio中测试项目的属性面板,查看C/C++ -> 常规 -> 附加包含目录,确认是否包含GTest的头文件路径(通常在Conan缓存的gtest/1.15.0/include目录)。如果未包含,说明CMake未正确传递依赖路径,回到上述步骤重新排查。
内容的提问来源于stack exchange,提问作者Ivan Petrov

