如何在CMake中自动将GitHub库下载到lib文件夹?C++项目集成googletest时add_subdirectory报错问题
解决CMake找不到googletest目录的问题
问题根源
你遇到的add_subdirectory given source "lib/googletest" which is not an existing directory错误,本质是路径不匹配:
- 你用
execute_process把googletest克隆到了构建目录(${CMAKE_CURRENT_BINARY_DIR}/lib,也就是你运行cmake时指定的build文件夹下的lib) - 但
add_subdirectory("lib/googletest")默认是从当前CMakeLists.txt所在的源码目录(项目根目录)去查找这个路径,而你的项目根目录lib下并没有克隆好的googletest,所以报错。
推荐解决方案:使用CMake官方的FetchContent(CMake 3.11+)
这是现代CMake管理第三方依赖的标准方式,不需要手动处理克隆、目录管理,CMake会自动完成下载、配置,还支持版本锁定,比手动execute_process更稳定可靠。
把主项目的CMakeLists.txt中相关代码替换成如下内容:
cmake_minimum_required(VERSION 3.11) project(YourProjectName) # 替换成你的项目名称 # 引入FetchContent模块 include(FetchContent) # 声明googletest依赖 FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.14.0 # 指定具体版本,避免自动更新到不稳定的最新版 ) # 下载并配置googletest if(NOT googletest_POPULATED) FetchContent_Populate(googletest) add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) endif() # 继续添加你的源码和测试目录 add_subdirectory(src) add_subdirectory(tst)
FetchContent会把googletest下载到CMake的构建缓存目录(默认在build/_deps下),自动处理依赖的配置和编译,不需要你手动维护项目根目录的lib文件夹。
备选方案:修正手动克隆的路径匹配
如果你坚持要把googletest放到项目根目录的lib文件夹下,可以修改execute_process的工作目录为源码目录,确保克隆的路径和add_subdirectory的查找路径一致:
if(UNIX) # 创建项目根目录下的lib文件夹(如果不存在) file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib) # 克隆到项目根目录的lib文件夹下,而非构建目录 execute_process( COMMAND git clone "https://github.com/google/googletest.git" googletest WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib # 避免重复克隆,已有googletest时跳过 RESULT_VARIABLE GTEST_CLONE_RESULT OUTPUT_QUIET ERROR_QUIET ) # 只有克隆成功或目录已存在时,才添加子目录 if(GTEST_CLONE_RESULT EQUAL 0 OR EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/googletest/CMakeLists.txt) add_subdirectory(lib/googletest) else() message(FATAL_ERROR "Failed to clone googletest to ${CMAKE_CURRENT_SOURCE_DIR}/lib") endif() endif(UNIX)
这里的关键是把${CMAKE_CURRENT_BINARY_DIR}替换成${CMAKE_CURRENT_SOURCE_DIR}:
${CMAKE_CURRENT_SOURCE_DIR}:当前CMakeLists.txt所在的源码目录(你的项目根目录)${CMAKE_CURRENT_BINARY_DIR}:CMake的构建输出目录(比如你指定的build文件夹)
这样克隆后的googletest就会出现在项目根目录的lib下,add_subdirectory就能正常找到它了。
内容的提问来源于stack exchange,提问作者MrSolarius
相关产品推荐
相关产品推荐

