如何用CMake FetchContent静态构建并链接OpenSSL与libCURL
解决CMake静态构建OpenSSL并链接到libCURL的问题
问题背景
使用CLion IDE,通过CMake构建系统开发项目,借助FetchContent从GitHub获取libCURL和OpenSSL(依赖janbar/openssl-cmake构建1.1.1w版本,官方OpenSSL原生不支持CMake),目标是静态构建OpenSSL后让libCURL静态链接它,但CMake报错找不到OpenSSL::SSL目标。
错误原因
janbar/openssl-cmake仓库生成的静态库目标为ssl和crypto,而非CMake生态通用的OpenSSL::SSL/OpenSSL::Crypto别名,而libCURL的CMake配置默认依赖这些标准别名,导致链接失败。
1. 静态构建OpenSSL
- 在拉取并配置OpenSSL前,设置静态构建相关选项,确保生成静态库:
# 强制静态构建OpenSSL set(OPENSSL_BUILD_STATIC_LIBS ON CACHE INTERNAL "" FORCE) set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE) # 强制使用静态CRT(针对MSVC环境) set(OPENSSL_USE_STATIC_LIBS ON CACHE INTERNAL "" FORCE)
- 调用
FetchContent_MakeAvailable(openssl)完成OpenSSL的构建流程。
2. 构建libCURL并静态链接OpenSSL
- 手动将janbar生成的目标别名化为CMake标准OpenSSL目标,让libCURL能识别到:
add_library(OpenSSL::SSL ALIAS ssl) add_library(OpenSSL::Crypto ALIAS crypto)
- 设置libCURL的静态构建及依赖OpenSSL的选项,再拉取并构建libCURL:
# 强制静态构建libCURL set(BUILD_STATIC_LIBS ON CACHE INTERNAL "" FORCE) set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE) # 关闭curl命令行工具和测试构建 set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE) set(BUILD_TESTING OFF CACHE INTERNAL "" FORCE) # 强制libCURL使用OpenSSL作为SSL后端 set(CURL_USE_OPENSSL ON CACHE INTERNAL "" FORCE) # 启用WebSocket支持(按需配置) set(ENABLE_WEBSOCKETS ON CACHE INTERNAL "" FORCE)
3. 完成链接操作
将libCURL的静态库目标直接链接到你的可执行文件即可:
target_link_libraries(${PROJECT_NAME} CURL::libcurl_static)
完整CMake代码
cmake_minimum_required(VERSION 3.28) set(PROJECT_NAME untitled) project(${PROJECT_NAME} C) set(CMAKE_C_STANDARD 11) include(FetchContent) # 声明OpenSSL依赖(基于janbar/openssl-cmake) FetchContent_Declare( openssl URL "https://github.com/janbar/openssl-cmake/archive/refs/tags/1.1.1w-20231130.tar.gz" OVERRIDE_FIND_PACKAGE ) # OpenSSL静态构建配置(必须在MakeAvailable前设置) set(OPENSSL_BUILD_STATIC_LIBS ON CACHE INTERNAL "" FORCE) set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE) set(OPENSSL_USE_STATIC_LIBS ON CACHE INTERNAL "" FORCE) # 构建OpenSSL FetchContent_MakeAvailable(openssl) # 生成标准OpenSSL目标别名 add_library(OpenSSL::SSL ALIAS ssl) add_library(OpenSSL::Crypto ALIAS crypto) # 声明libCURL依赖 FetchContent_Declare( curl URL "https://github.com/curl/curl/archive/refs/tags/curl-8_7_1.tar.gz" OVERRIDE_FIND_PACKAGE ) # libCURL静态构建配置(必须在MakeAvailable前设置) set(BUILD_STATIC_LIBS ON CACHE INTERNAL "" FORCE) set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE) set(ENABLE_WEBSOCKETS ON CACHE INTERNAL "" FORCE) set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE) set(BUILD_TESTING OFF CACHE INTERNAL "" FORCE) set(CURL_USE_OPENSSL ON CACHE INTERNAL "" FORCE) # 构建libCURL FetchContent_MakeAvailable(curl) # 生成可执行文件并链接libCURL静态库 add_executable(${PROJECT_NAME} main.c) target_link_libraries(${PROJECT_NAME} CURL::libcurl_static)
额外说明
- 所有配置选项必须放在对应
FetchContent_MakeAvailable命令之前,否则选项无法生效。 - MSVC环境下,janbar/openssl-cmake会自动使用静态CRT(/MT/MTd),如需调整可修改对应CMake选项。
- 若编译时提示缺少ZLIB等依赖,可同样通过
FetchContent拉取静态版本并配置,确保libCURL能找到对应目标。
内容的提问来源于stack exchange,提问作者mercy
相关产品推荐
相关产品推荐

