C++如何静态编译并使用openssl/md5.h 解决MD5相关LNK2001错误
OpenSSL MD5功能LNK2001链接错误解决方案
你的报错属于典型的仅配置了头文件路径、未关联对应实现库导致的符号未找到问题,可通过以下两种方式获取对应库,再完成VS项目配置即可解决:
方式1:使用预编译库(操作最简单)
直接下载匹配你开发环境的OpenSSL预编译包即可,需要匹配三个维度:
- 目标架构:和你项目编译的x86/x64一致
- VS版本:和你使用的Visual Studio大版本匹配
- 运行时类型:和你项目「C/C++ -> 代码生成 -> 运行库」的配置(MT/MD/MTd/MDd)一致
预编译包解压后即可获得头文件目录include、库文件目录lib,还有动态库对应的bin目录。
方式2:自行编译OpenSSL源码生成库
找不到匹配环境的预编译包时可以自行编译:
- 提前准备编译依赖:安装对应版本Visual Studio、Perl、NASM,并将三个工具的执行路径加入系统环境变量PATH
- 打开对应架构的VS原生命令提示符(比如编译x64就打开「x64 Native Tools Command Prompt for VS 你的版本」),切换到OpenSSL源码根目录
- 执行配置命令,示例如下:
编译静态x64 Release版本:perl Configure VC-WIN64A no-shared --prefix="D:\OpenSSL\build\x64\Release"
编译静态x64 Debug版本:perl Configure VC-WIN64A no-shared --debug --prefix="D:\OpenSSL\build\x64\Debug"
需要动态库则去掉命令中的no-shared参数 - 依次执行编译安装命令:
执行完成后你nmake nmake install--prefix指定的目录下就会生成所需的头文件、库文件。
最终VS项目配置
不管用哪种方式获取库,都需要完成以下配置:
- 打开项目属性页,先将顶部的「配置」「平台」切换为你当前编译使用的配置,避免配置错目标
- 确认「C/C++ -> 常规 -> 附加包含目录」中已添加OpenSSL的
include目录路径(你已完成该步) - 新增「链接器 -> 常规 -> 附加库目录」配置,添加OpenSSL的
lib目录路径 - 新增「链接器 -> 输入 -> 附加依赖项」配置,添加对应的库名称:
- 静态Release版本加
libcrypto.lib - 静态Debug版本加
libcryptod.lib
动态库版本的库名和上述一致,运行时需要将bin目录下的对应dll放到程序执行目录
- 静态Release版本加
- 若你使用的是OpenSSL 3.0及以上版本,MD5属于默认弃用的遗留算法,需要在引入OpenSSL头文件之前定义
OPENSSL_SUPPRESS_DEPRECATED宏,或编译OpenSSL时开启legacy算法支持,否则依然会报符号找不到错误。
内容的提问来源于stack exchange,提问作者learnzz
相关产品推荐
相关产品推荐

