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

Windows下CMake无法找到OpenSSL的问题求助

Windows下CMake FetchContent构建cpr+jwt-cpp项目时无法找到OpenSSL的解决方法

我在Windows系统上通过CMake的FetchContent构建一个使用cpr和jwt-cpp的极简C++示例,已经用choco install openssl安装了OpenSSL,默认路径是C:\Program Files\OpenSSL-Win64,但即使设置了OPENSSL_ROOT_DIR,CMake仍报错:

CMake Error at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY) (found
  suitable version "3.5.0", minimum required is "1.0.1")
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.26/Modules/FindOpenSSL.cmake:670 (find_package_handle_standard_args)
  build/_deps/jwt-cpp-src/CMakeLists.txt:52 (find_package)

我的CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.14)
project(my_project)

set(CMAKE_CXX_STANDARD 17)

include(FetchContent)

find_package(OpenSSL REQUIRED)

# ✅ Set OpenSSL path (using forward slashes to avoid escaping issues)
set(OPENSSL_ROOT_DIR "C:/Program Files/OpenSSL-Win64")
set(OPENSSL_USE_STATIC_LIBS TRUE)

# Fetch CPR (HTTP client)
FetchContent_Declare(
  cpr
  GIT_REPOSITORY https://github.com/libcpr/cpr.git
  GIT_TAG 1.11.0
)
set(CPR_BUILD_TESTS OFF)
set(CPR_FORCE_USE_SYSTEM_CURL OFF)  # Let cpr build curl itself
set(CPR_USE_OPENSSL ON)
FetchContent_MakeAvailable(cpr)

# Fetch JWT-CPP (JWT library)
FetchContent_Declare(
  jwt-cpp
  GIT_REPOSITORY https://github.com/Thalhammer/jwt-cpp.git
  GIT_TAG v0.6.0
)
FetchContent_MakeAvailable(jwt-cpp)

add_executable(my_project main.cpp)

target_link_libraries(my_project PRIVATE cpr::cpr)
target_include_directories(my_project PRIVATE ${jwt-cpp_SOURCE_DIR}/include)

源文件main.cpp内容:

#include <iostream>
#include <cpr/cpr.h>
#include <jwt-cpp/jwt.h>

int main() {
    std::string secret = "my_secret";

    // 1. Create JWT token
    auto token = jwt::create()
        .set_issuer("my_app")
        .set_type("JWT")
        .set_payload_claim("user_id", jwt::claim(std::string("123456")))
        .sign(jwt::algorithm::hs256{ secret });

    std::cout << "Generated JWT:\n" << token << "\n\n";

    // 2. Send HTTP GET request with JWT token
    auto response = cpr::Get(
        cpr::Url{"https://httpbin.org/get"},
        cpr::Header{{"Authorization", "Bearer " + token}}
    );

    std::cout << "HTTP Status: " << response.status_code << "\n";
    std::cout << "Response Body:\n" << response.text << "\n";

    // 3. Decode and verify the token
    try {
        auto decoded = jwt::decode(token);
        jwt::verify()
            .allow_algorithm(jwt::algorithm::hs256{ secret })
            .with_issuer("my_app")
            .verify(decoded);

        std::cout << "\nToken is valid!\n";
        std::cout << "User ID: " << decoded.get_payload_claim("user_id").as_string() << "\n";
    } catch (const std::exception& e) {
        std::cerr << "JWT verification failed: " << e.what() << "\n";
    }

    return 0;
}

OpenSSL根目录下的lib文件夹结构:

- lib
  -- VC
    -- x64
      -- MD
      -- MDd
      -- MT
      -- MTd

问题原因

  1. find_package(OpenSSL)调用时机错误:在设置OPENSSL_ROOT_DIR之前就执行了查找操作,CMake未读取到手动指定的路径,默认搜索逻辑无法定位到正确的库文件。
  2. 静态库路径未明确指定:Choco安装的OpenSSL静态库存放在VC/x64/MT等深层子目录中,CMake默认搜索路径不包含这些位置,导致找不到libcrypto.lib和libssl.lib。
  3. 子项目未继承OpenSSL配置:错误由jwt-cpp的CMakeLists触发,拉取的子项目无法读取主项目中设置的OpenSSL变量。

修复步骤

1. 调整配置与查找的顺序

将OpenSSL相关设置移到find_package之前,确保CMake查找时使用指定路径:

# 先配置OpenSSL参数
set(OPENSSL_ROOT_DIR "C:/Program Files/OpenSSL-Win64")
set(OPENSSL_USE_STATIC_LIBS TRUE)
# 再执行查找
find_package(OpenSSL REQUIRED)

2. 手动指定静态库路径

根据项目使用的运行时库(Debug用MTd/MDd,Release用MT/MD),直接指定库文件位置:

# 以Release静态MT为例,根据实际情况修改子目录
set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_ROOT_DIR}/lib/VC/x64/MT/libcrypto.lib")
set(OPENSSL_SSL_LIBRARY "${OPENSSL_ROOT_DIR}/lib/VC/x64/MT/libssl.lib")

3. 让子项目继承OpenSSL配置

将OpenSSL变量设为全局,确保jwt-cpp能读取到:

set(OPENSSL_ROOT_DIR "${OPENSSL_ROOT_DIR}" CACHE PATH "OpenSSL root directory" FORCE)
set(OPENSSL_USE_STATIC_LIBS "${OPENSSL_USE_STATIC_LIBS}" CACHE BOOL "Use static OpenSSL libraries" FORCE)
set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_CRYPTO_LIBRARY}" CACHE FILEPATH "OpenSSL crypto library" FORCE)
set(OPENSSL_SSL_LIBRARY "${OPENSSL_SSL_LIBRARY}" CACHE FILEPATH "OpenSSL SSL library" FORCE)

完整修复后的CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(my_project)

set(CMAKE_CXX_STANDARD 17)

include(FetchContent)

# 1. 配置OpenSSL参数
set(OPENSSL_ROOT_DIR "C:/Program Files/OpenSSL-Win64")
set(OPENSSL_USE_STATIC_LIBS TRUE)
# 指定静态库路径(根据运行时选择MT/MD,此处为Release静态MT)
set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_ROOT_DIR}/lib/VC/x64/MT/libcrypto.lib")
set(OPENSSL_SSL_LIBRARY "${OPENSSL_ROOT_DIR}/lib/VC/x64/MT/libssl.lib")

# 2. 查找OpenSSL
find_package(OpenSSL REQUIRED)

# 3. 全局设置OpenSSL变量,确保子项目可见
set(OPENSSL_ROOT_DIR "${OPENSSL_ROOT_DIR}" CACHE PATH "OpenSSL root directory" FORCE)
set(OPENSSL_USE_STATIC_LIBS "${OPENSSL_USE_STATIC_LIBS}" CACHE BOOL "Use static OpenSSL libraries" FORCE)
set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_CRYPTO_LIBRARY}" CACHE FILEPATH "OpenSSL crypto library" FORCE)
set(OPENSSL_SSL_LIBRARY "${OPENSSL_SSL_LIBRARY}" CACHE FILEPATH "OpenSSL SSL library" FORCE)

# Fetch CPR (HTTP client)
FetchContent_Declare(
  cpr
  GIT_REPOSITORY https://github.com/libcpr/cpr.git
  GIT_TAG 1.11.0
)
set(CPR_BUILD_TESTS OFF)
set(CPR_FORCE_USE_SYSTEM_CURL OFF)
set(CPR_USE_OPENSSL ON)
FetchContent_MakeAvailable(cpr)

# Fetch JWT-CPP (JWT library)
FetchContent_Declare(
  jwt-cpp
  GIT_REPOSITORY https://github.com/Thalhammer/jwt-cpp.git
  GIT_TAG v0.6.0
)
FetchContent_MakeAvailable(jwt-cpp)

add_executable(my_project main.cpp)

target_link_libraries(my_project PRIVATE cpr::cpr OpenSSL::SSL OpenSSL::Crypto)
target_include_directories(my_project PRIVATE ${jwt-cpp_SOURCE_DIR}/include)

额外注意事项

  • 确保CMake生成器架构(如Visual Studio 2022 Win64)与OpenSSL的x64架构一致,避免32/64位不匹配。
  • 可将OPENSSL_ROOT_DIR添加到系统环境变量,重启终端后无需在CMakeLists中手动设置路径。

内容的提问来源于stack exchange,提问作者user2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:07:11