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
问题原因
find_package(OpenSSL)调用时机错误:在设置OPENSSL_ROOT_DIR之前就执行了查找操作,CMake未读取到手动指定的路径,默认搜索逻辑无法定位到正确的库文件。- 静态库路径未明确指定:Choco安装的OpenSSL静态库存放在
VC/x64/MT等深层子目录中,CMake默认搜索路径不包含这些位置,导致找不到libcrypto.lib和libssl.lib。 - 子项目未继承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
相关产品推荐
相关产品推荐

