You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:54:54