CMake报错Could NOT find CURL (missing: CURL_LIBRARY)如何解决?
解决FetchContent构建curlpp时找不到CURL依赖的问题
问题重现
使用FetchContent从源码构建curl和curlpp时,执行FetchContent_MakeAvailable(curlpp)出现以下报错:
Could NOT find CURL (missing: CURL_LIBRARY)
相关CMake配置代码如下:
cmake_minimum_required(VERSION 3.17) project(myproject VERSION 1.0.0) include(FetchContent) include(CMakePrintHelpers) cmake_print_variables(CMAKE_CXX_FLAGS) if (WIN32) set(CMAKE_USE_SCHANNEL ON) endif() # --- CURL FetchContent_Declare(curl URL https://github.com/curl/curl/releases/download/curl-7_75_0/curl-7.75.0.tar.xz URL_HASH SHA256=fe0c49d8468249000bda75bcfdf9e30ff7e9a86d35f1a21f428d79c389d55675 # the file hash for curl-7.75.0.tar.xz USES_TERMINAL_DOWNLOAD TRUE) FetchContent_MakeAvailable(curl) add_library(curl_int INTERFACE) target_link_libraries(curl_int INTERFACE libcurl) target_include_directories(curl_int INTERFACE ${curl_SOURCE_DIR}/include ${curl_BINARY_DIR}/include/curl) add_library(CURL::mylibcurl ALIAS curl_int) set(CURL_INCLUDE_DIR ${curl_SOURCE_DIR}/include ) # --- CURL C++ FetchContent_Declare(curlpp GIT_REPOSITORY https://github.com/jpbarrette/curlpp.git ) FetchContent_MakeAvailable(curlpp) # ----> Error occurs here cmake_print_variables(curlpp_SOURCE_DIR curlpp_BINARY_DIR) add_library(curlpp_int INTERFACE) target_link_libraries(curlpp_int INTERFACE libcurlpp CURL::mylibcurl) target_include_directories(curlpp_int INTERFACE ${curlpp_SOURCE_DIR}/include ${curlpp_BINARY_DIR}/include/curl) add_library(CURLPP::mylibcurlpp ALIAS curlpp_int) set(CURLPP_INCLUDE_DIR ${curlpp_SOURCE_DIR}/include ) set(CURLPP_LIB_DIR ${curlpp_BINARY_DIR}) cmake_print_variables(CURLPP_LIB_DIR) cmake_print_variables(CURLPP::mylibcurlpp) # The rest of CMakeLists.txt is omitted
问题原因
curlpp的CMake配置脚本会调用find_package(CURL)查找依赖,但通过FetchContent构建的curl不会自动设置find_package所需的CURL_LIBRARY、CURL_INCLUDE_DIR等变量,也不会默认将自身配置路径加入CMake搜索路径,导致curlpp的配置流程无法找到已构建的curl库。
解决方案
方案一:手动设置curlpp依赖的CURL变量
在执行curlpp构建前,手动设置find_package(CURL)需要的变量,指向已构建的curl:
# --- CURL C++ FetchContent_Declare(curlpp GIT_REPOSITORY https://github.com/jpbarrette/curlpp.git ) # 手动设置CURL相关变量,让curlpp的find_package能找到 set(CURL_INCLUDE_DIR "${curl_SOURCE_DIR}/include;${curl_BINARY_DIR}/include/curl" CACHE INTERNAL "") set(CURL_LIBRARY libcurl CACHE INTERNAL "") set(CURL_FOUND TRUE CACHE INTERNAL "") FetchContent_MakeAvailable(curlpp)
方案二:手动控制curlpp构建流程,指定CURL目标(更规范)
curlpp支持通过CURLPP_CURL_TARGET选项直接指定已存在的CURL目标,拆分FetchContent_MakeAvailable流程并插入该选项设置:
# --- CURL C++ FetchContent_Declare(curlpp GIT_REPOSITORY https://github.com/jpbarrette/curlpp.git ) # 手动处理curlpp的拉取和构建,避免自动调用find_package失败 FetchContent_GetProperties(curlpp) if(NOT curlpp_POPULATED) FetchContent_Populate(curlpp) # 指定curlpp使用已构建的libcurl目标 set(CURLPP_CURL_TARGET libcurl CACHE INTERNAL "") add_subdirectory(${curlpp_SOURCE_DIR} ${curlpp_BINARY_DIR}) endif()
后续链接配置说明
你原本的curlpp_int接口库配置可以保留,它已经正确完成了curlpp与curl的链接,无需额外修改。
内容的提问来源于stack exchange,提问作者shashashamti2008
相关产品推荐
相关产品推荐

