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

读取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,但问题没解决。想请教三个问题:

  1. 该SSL入口点是否存在于libcurl-4.dll中?
  2. 是否需要重装OpenSSL?
  3. 这个入口点为何与当前读取本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:04:55