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

Mac M1环境下CLion编译OpenSSL相关C/C++程序报错的解决咨询

解决CLion中OpenSSL链接失败(Undefined symbols)的问题

你遇到的是链接阶段无法找到OpenSSL库实现的问题——虽然CMake已经成功定位到头文件(所以编译环节能通过),但没有把OpenSSL的库文件正确关联到你的可执行目标上。另外你的测试代码里RAND_bytes的调用参数也存在错误,咱们一步步来解决:

1. 修正CMakeLists.txt的核心问题

你的CMake配置有两个关键疏漏:

  • 路径不匹配:M1/M2架构的Mac上,Brew默认安装路径是/opt/homebrew/,但你配置里写的是Intel Mac的/usr/local/,这会导致CMake找不到正确的库文件。
  • 缺少库链接步骤:find_package(OpenSSL REQUIRED)能帮你找到库资源,但你需要明确把这些库链接到你的可执行程序上。

修正后的完整CMakeLists.txt示例:

cmake_minimum_required(VERSION 3.20)
project(PV181_HW03)

# 设置C语言标准版本
set(CMAKE_C_STANDARD 11)

# 指定你通过Brew安装的OpenSSL根路径
set(OPENSSL_ROOT_DIR /opt/homebrew/Cellar/openssl@1.1/1.1.1i/)
set(OPENSSL_USE_STATIC_LIBS TRUE) # 若需要动态库,可改为FALSE

# 查找OpenSSL库
find_package(OpenSSL REQUIRED)

# 添加可执行文件目标
add_executable(PV181_HW03 main.c)

# 关键步骤:将OpenSSL的库链接到你的程序
target_link_libraries(PV181_HW03 PRIVATE OpenSSL::SSL OpenSSL::Crypto)

2. 修正测试代码的参数错误

RAND_bytes的函数签名要求第一个参数是指向缓冲区的指针,你直接传入数值10是不符合要求的。修正后的测试代码:

#include <openssl/rand.h>
#include <stdio.h>

int main(){
    unsigned char buf[10];
    // 生成随机字节到缓冲区中
    if (RAND_bytes(buf, sizeof(buf)) != 1) {
        printf("随机字节生成失败\n");
        return 1;
    }
    // 可选:打印生成的随机字节(十六进制格式)
    for (int i = 0; i < sizeof(buf); i++) {
        printf("%02x ", buf[i]);
    }
    printf("\n");
    return 0;
}

3. 额外排查步骤(若上述方法仍不生效)

  • 清理CLion缓存:点击File -> Reload CMake Project,或者直接删除项目下的build文件夹后重新构建。
  • 验证Brew安装路径:在终端执行brew info openssl@1.1,确认输出的路径和你配置的OPENSSL_ROOT_DIR完全一致。
  • 用pkg-config自动查找库:如果手动指定路径仍有问题,可以尝试让CMake通过pkg-config自动定位OpenSSL:
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(OPENSSL REQUIRED openssl)
    include_directories(${OPENSSL_INCLUDE_DIRS})
    target_link_libraries(PV181_HW03 PRIVATE ${OPENSSL_LIBRARIES})
    
    这种方式无需手动设置路径,适配性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:02:35