CMake FindCURL找到CURL但未设置CURL_LIBRARIES和CURL_INCLUDE_DIRS问题
问题:CMake找到指定版本libcurl但变量为空、链接失败
我从源码编译安装libcurl到/usr/local/目录,在项目主CMakeLists.txt中使用find_package(CURL 7.88.1 EXACT REQUIRED),CMake能成功找到对应版本,但打印CURL_LIBRARIES和CURL_INCLUDE_DIRS时输出为空。尝试通过CURL::libcurl(定义在CURLTargets.cmake中)链接,仍无法将共享库链接到二进制文件。
相关CMake代码:
find_package(CURL 7.88.1 EXACT REQUIRED) message("curl libs: ${CURL_LIBRARIES}") message("curl dirs: ${CURL_INCLUDE_DIRS}") ... target_include_directories(${PROJECT_NAME} PUBLIC ${Boost_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${RAPIDJSON_INCLUDE_DIRS} ${ZeroMQ_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} spdlog::spdlog CURL::libcurl ${CURL_LIBRARIES} ${ZeroMQ_LIBRARY})
执行输出:
-- Found CURL: /usr/local/lib/cmake/CURL/CURLConfig.cmake (found suitable exact version "7.88.1") curl libs: curl dirs:
环境信息:Windows子系统Linux Ubuntu 20.04,CMake版本3.19.8
原因分析
这是因为从源码编译安装的libcurl使用了自身携带的CURLConfig.cmake配置文件,而非CMake内置的FindCURL.cmake模块:
- 内置
FindCURL.cmake会生成CURL_LIBRARIES、CURL_INCLUDE_DIRS这类传统变量 - libcurl自带的配置文件仅导出
CURL::libcurl这个现代CMake目标,不会设置上述传统变量
链接失败则是因为混用了现代目标和传统变量,加上CMake 3.19.8对现代目标的支持存在局限。
解决步骤
移除传统变量引用
- 删除
target_include_directories中的${CURL_INCLUDE_DIRS},CURL::libcurl目标已包含头文件路径 - 删除
target_link_libraries中的${CURL_LIBRARIES},避免冗余或冲突
- 删除
正确使用
CURL::libcurl目标
修改后的链接代码:target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} spdlog::spdlog CURL::libcurl ${ZeroMQ_LIBRARY})验证链接结果
用以下命令检查二进制文件的依赖:ldd your_binary_name | grep curl若输出包含
libcurl.so.4(对应7.88.1版本),则链接成功。可选:强制使用
FindCURL.cmake(不推荐)
若必须使用传统变量,可设置CMAKE_FIND_PACKAGE_PREFER_CONFIG为OFF,强制CMake调用内置模块:set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF) find_package(CURL 7.88.1 EXACT REQUIRED)但这种方式不符合现代CMake规范,不建议使用。
内容的提问来源于stack exchange,提问作者E. Tolga
相关产品推荐
相关产品推荐

