You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用<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(注意不是系统自带的那个)。

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

火山引擎 最新活动