GitHub Actions Windows 2019环境bcrypt缺失致编译失败求助
问题背景与现象
- 需求:在Windows平台编译GameNetworkingSockets,使用系统自带的BCrypt替代OpenSSL,避免额外安装依赖。
- 环境差异:GitHub Actions中Windows 2022编译正常,但Windows 2019提示BCrypt缺失,CMake报错如下:
-- Looking for BCryptEncrypt
-- Looking for BCryptEncrypt - not found
CMake Error at externals/gamenetworkingsockets/GameNetworkingSockets/CMakeLists.txt:95 (message):
You're on Windows but BCrypt seems to be unavailable, you will need OpenSSL
- 修改CMake检测代码后的新问题:
- Windows 2019下所有BCrypt检测逻辑依然不生效;
- Windows 2022中,若先引入
bcrypt.h会触发语法错误:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\bcrypt.h(39,31): error C2143: syntax error: missing ')' before 'return' [F:\personal\cage-examples\externals\cage\build\CMakeFiles\CMakeTmp\cmTC_61959.vcxproj]
解决思路
1. 修正CMake检测时的库链接逻辑
Windows 2019自带BCrypt库,但原检测代码可能未显式链接bcrypt.lib导致符号查找失败。修改CMakeLists.txt中的检测逻辑:
- 在执行
CHECK_FUNCTION_EXISTS(BCryptEncrypt HAVE_BCRYPTENCRYPT)之前,添加set(CMAKE_REQUIRED_LIBRARIES bcrypt.lib),确保检测时链接系统库。 - 若使用
find_package,可指定查找BCrypt组件并强制链接。
2. 调整头文件包含顺序
Windows SDK的bcrypt.h依赖windows.h中的宏定义,必须先包含windows.h再引入bcrypt.h。修改CMake检测用的测试代码:
#include <windows.h> #include <bcrypt.h>
避免因宏缺失导致的语法错误。
3. 显式指定Windows SDK版本
Windows 2019环境可能默认使用较旧的SDK版本,显式指定兼容的Windows 10 SDK版本(如10.0.19041.0):
- 在CMake命令中添加参数:
-DCMAKE_SYSTEM_VERSION=10.0.19041.0; - 在GitHub Actions的Windows 2019任务中,通过相关工具指定SDK版本。
4. 验证系统库的可访问性
Windows 2019系统自带bcrypt.dll(路径C:\Windows\System32\bcrypt.dll),若CMake仍无法检测,可:
- 检查GitHub Actions的Windows 2019环境是否为完整系统镜像,而非裁剪版容器;
- 手动指定库路径,或在CMake中显式添加
link_directories指向系统库目录。
内容的提问来源于stack exchange,提问作者Tomas

