Bazel构建C++项目:Windows及跨平台链接bcrypt.lib适配Boost UUID
在Bazel中跨平台链接Boost UUID的正确方式
问题背景
使用Bazel开发C++应用,集成Boost UUID库时遇到以下问题:
- Windows下需链接Windows SDK中的
bcrypt.lib,但当前cc_import配置会在本地目录查找库文件,导致多架构兼容问题 - 编译时出现LNK2019未解析外部符号错误,对应
BCryptCloseAlgorithmProvider、BCryptGenRandom、BCryptOpenAlgorithmProvider函数
跨平台解决方案
Windows平台
要自动适配不同架构并正确指向Windows SDK中的bcrypt.lib,需通过select区分目标架构,并结合SDK路径配置:
硬编码SDK版本(适用于固定环境)
cc_import( name = "bcrypt", interface_library = select({ "@bazel_tools//src/conditions:windows_x86_64": "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22621.0/um/x64/bcrypt.lib", "@bazel_tools//src/conditions:windows_x86": "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22621.0/um/x86/bcrypt.lib", "@bazel_tools//src/conditions:windows_arm64": "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22621.0/um/arm64/bcrypt.lib", }), system_provided = True, ) cc_library( name = "your_lib", srcs = ["your_source.cpp"], deps = [ ":bcrypt", "@boost//:uuid", # 确保已引入Boost UUID依赖 ], )
注:替换10.0.22621.0为你实际安装的Windows SDK版本号
动态获取SDK版本(推荐,适配多环境)
通过Bazel内置工具函数自动获取SDK版本,避免硬编码:
load("@bazel_tools//tools/cpp:windows_cc_configure.bzl", "find_windows_sdk_version") windows_sdk_version = find_windows_sdk_version() cc_import( name = "bcrypt", interface_library = select({ "@bazel_tools//src/conditions:windows_x86_64": "C:/Program Files (x86)/Windows Kits/10/Lib/%s/um/x64/bcrypt.lib" % windows_sdk_version, "@bazel_tools//src/conditions:windows_x86": "C:/Program Files (x86)/Windows Kits/10/Lib/%s/um/x86/bcrypt.lib" % windows_sdk_version, "@bazel_tools//src/conditions:windows_arm64": "C:/Program Files (x86)/Windows Kits/10/Lib/%s/um/arm64/bcrypt.lib" % windows_sdk_version, }), system_provided = True, ) cc_library( name = "your_lib", srcs = ["your_source.cpp"], deps = [":bcrypt", "@boost//:uuid"], )
macOS平台
macOS下Boost UUID的random_generator会自动调用系统随机数接口(如arc4random_buf),无需额外链接系统库,只需确保Boost UUID依赖正确:
cc_library( name = "your_lib", srcs = ["your_source.cpp"], deps = ["@boost//:uuid"], )
Debian/Ubuntu等Linux平台
Linux下random_generator依赖OpenSSL的libcrypto库,可通过两种方式配置:
方式1:直接链接系统库
cc_library( name = "your_lib", srcs = ["your_source.cpp"], deps = ["@boost//:uuid"], linkopts = ["-lcrypto"], )
方式2:通过Bazel依赖引入OpenSSL
若项目已集成OpenSSL的Bazel规则,直接依赖即可:
cc_library( name = "your_lib", srcs = ["your_source.cpp"], deps = [ "@boost//:uuid", "@openssl//:crypto", ], )
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

