使用<bcrypt.h>库调用bcrypt_gensalt时遇未解析外部符号错误求助
解决
bcrypt_gensalt 未解析外部符号错误 首先得明确:你碰到的这个是链接错误,不是编译错误。编译器已经通过了(毕竟你包含了<bcrypt.h>,能找到函数声明),但链接器找不到bcrypt_gensalt函数的实际实现代码,所以才报这个错。下面分情况给你梳理解决思路:
1. 别混淆Windows系统BCrypt API和第三方bcrypt库
Windows系统自带的<bcrypt.h>是系统级加密API,它的函数全是以BCrypt开头的(比如BCryptGenerateSalt),根本没有bcrypt_gensalt这个函数!如果你是想实现OpenBSD风格的bcrypt哈希(就是带$2a$前缀那种),得用第三方的bcrypt移植库,比如libbcrypt。
这种情况下要做两件事:
- 确保你包含的是第三方库的
<bcrypt.h>,而非系统自带的。可以把第三方库的头文件目录放在编译器搜索路径最前面,或者直接重命名第三方头文件避免冲突。 - 链接第三方库的二进制文件:
- 用MinGW/GCC编译时,命令行加上
-lbcrypt(如果库文件是libbcrypt.a),要是库不在默认搜索路径,还要加-L/path/to/your/lib指定库所在目录。 - 用MSVC的话,在项目属性的「链接器」→「输入」里添加第三方库的
bcrypt.lib(注意不是系统自带的那个)。
- 用MinGW/GCC编译时,命令行加上
2. 非Windows系统或已确认用第三方库:正确链接库文件
如果是在Linux/macOS环境下:
- 先安装bcrypt开发库,比如Debian/Ubuntu用
sudo apt-get install libbcrypt-dev,macOS用Homebrew执行brew install bcrypt。 - 编译时加上
-lbcrypt参数,比如:g++ your_code.cpp -o your_program -lbcrypt
3. 检查函数签名是否匹配
有些bcrypt库的bcrypt_gensalt函数签名可能有细微差异,比如部分版本要求第一个参数是u_int8_t类型,你代码里传的10是int,虽然隐式转换没问题,但最好确认下你用的库的头文件声明:
// 标准OpenBSD bcrypt的函数签名 char *bcrypt_gensalt(u_int8_t log_rounds, char *salt);
你的调用bcrypt_gensalt(10, results);是符合这个签名的,但如果库的实现不匹配,也会导致链接错误,这时候就得换个匹配的库版本。
最后提一句:要是你本来就想用Windows自带的加密功能,那得放弃bcrypt_gensalt,改用系统API的BCryptGenerateSalt等函数,但用法完全不同,得重新写代码。
内容的提问来源于stack exchange,提问作者Pietr Pietrowski




