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
相关产品推荐
相关产品推荐

