读取HDF5文件时遇SSL_get0_group_name未找到错误的求助
问题
我用C语言读取并打印HDF5文件中的权重矩阵,在CLion里通过CMake+Clang+MinGW工具集构建项目,运行生成的exe时出现错误:
The procedure entry point "SSL_get0_group_name" was not found in the DLL "C:\msys64\mingw64\bin\libcurl-4.dll"
我已经尝试在CMake中添加CURL依赖,也通过mingw-w64的pacman重装了curl-4,但问题没解决。想请教三个问题:
- 该SSL入口点是否存在于libcurl-4.dll中?
- 是否需要重装OpenSSL?
- 这个入口点为何与当前读取本地HDF5文件的操作相关?
代码
#include <stdio.h> #include <cblas.h> #include <hdf5.h> #define FILENAME "src/model/model_weights.hdf5" #define ROWS 3 #define COLS 3 void print_matrix(const char *name, double *matrix, int rows, int cols) { printf("%s:\n", name); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { printf("%f\t", matrix[i * cols + j]); } printf("\n"); } printf("\n"); } int main(void){ hid_t file_id, dataset_id, dataspace_id; herr_t status; double data[10]; file_id = H5Fopen("model_weights.hdf5", H5F_ACC_RDONLY, H5P_DEFAULT); // Open dataset dataset_id = H5Dopen2(file_id, "/dataset_name", H5P_DEFAULT); // Read dataset status = H5Dread(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); // Close dataset status = H5Dclose(dataset_id); // Close file status = H5Fclose(file_id); print_matrix("data", data, ROWS, COLS); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 3.27) set(LIB_DIR "C:/msys64/mingw64/lib") set(MODEL_DIR "N:/Project_1/src/models") set(CMAKE_C_STANDARD 23) project(Project_1 C) find_package(OpenBLAS REQUIRED) find_package(HDF5 REQUIRED COMPONENTS C) find_package(CURL REQUIRED) include_directories(${HDF5_INCLUDE_DIRS}) include_directories(${LIB_DIR}) include_directories(${MODEL_DIR}) add_executable(Project_1 src/main.c) find_library(OPENBLAS_LIBRARY NAMES openblas PATHS ${LIB_DIR}) find_library(HDF5_LIBRARY NAMES hdf5 PATHS ${LIB_DIR}) find_library(CURL_LIBRARY NAMES libcurl PATHS ${LIB_DIR}) if(NOT OPENBLAS_LIBRARY) message(FATAL_ERROR "OpenBLAS library not found ${CMAKE_SYSTEM_LIBRARY_PATH}") endif() target_include_directories(Project_1 PRIVATE ${HDF5_INCLUDE_DIRS}) target_link_libraries(Project_1 OpenBLAS::OpenBLAS) target_link_libraries(Project_1 ${HDF5_C_LIBRARIES})
回答
1. SSL_get0_group_name是否存在于libcurl-4.dll中?
不存在。SSL_get0_group_name是OpenSSL库的专属函数,用于获取TLS连接的密钥交换组名称,属于SSL/TLS通信相关的API。libcurl只是依赖OpenSSL实现加密通信功能,自身不会包含这个函数。错误出现的原因是:libcurl运行时需要调用这个OpenSSL函数,但当前系统中的OpenSSL DLL版本不匹配,找不到该入口点。
2. 是否需要重装OpenSSL?
直接重装不一定能解决问题,核心是要保证libcurl和OpenSSL的版本完全兼容。可以按以下步骤操作:
- 用
pacman -Qi mingw-w64-x86_64-curl查看curl的依赖信息,确认它要求的OpenSSL版本 - 安装对应版本的OpenSSL(比如64位环境执行
pacman -S mingw-w64-x86_64-openssl) - 也可以直接重新安装curl和OpenSSL的组合包,强制版本匹配:
pacman -S --reinstall mingw-w64-x86_64-curl mingw-w64-x86_64-openssl
3. 为什么这个入口点和读取本地HDF5文件的操作相关?
你的代码没有直接调用curl或SSL功能,但HDF5库在编译时默认会链接curl——HDF5支持通过curl读取远程HTTP/HTTPS路径下的HDF5文件。即使你读取的是本地文件,HDF5运行时依然会加载它所有依赖的库(包括curl),而curl又依赖OpenSSL,这就触发了版本不兼容的问题。
额外解决建议
- 检查系统PATH环境变量,确保
C:\msys64\mingw64\bin的优先级高于其他可能存在旧版OpenSSL/curl的路径,避免加载错误的DLL - 你的CMake配置中添加了
find_package(CURL REQUIRED)但没有链接到目标,不过这不是问题根源;如果不需要HDF5的远程文件功能,可以尝试编译不带curl支持的HDF5版本,但mingw仓库中的HDF5默认带curl,所以版本匹配是更简单的方案
内容的提问来源于stack exchange,提问作者Sisoviromol
相关产品推荐
相关产品推荐

