Bazel构建依赖{fmt}动态库的C++项目报错,求解决方案
问题解决方案
错误原因
cc_import中shared_library字段使用相对路径libfmt.so,Bazel会在当前main包目录下查找该文件,但实际系统动态库位于/usr/lib64,导致文件找不到cc_binary中额外添加linkopts = ["-lfmt"]属于冗余配置,会干扰Bazel的依赖管理逻辑
正确修改方案
1. 修正cc_import配置
通过绝对路径指定系统动态库位置,同时配置头文件路径确保编译时能找到fmt的头文件:
cc_import( name = "fmt", hdrs = glob(["/usr/include/fmt/*.h"]), # 引入系统中fmt的头文件集合 shared_library = "/usr/lib64/libfmt.so", # 指定系统动态库的绝对路径 visibility = ["//visibility:public"], )
2. 简化cc_binary配置
移除冗余的linkopts配置,让Bazel通过依赖链自动处理链接逻辑:
cc_binary( name = "main", srcs = ["main.cc"], deps = [":lib"], linkstatic = 0, )
完整修改后的BUILD文件
cc_import( name = "fmt", hdrs = glob(["/usr/include/fmt/*.h"]), shared_library = "/usr/lib64/libfmt.so", visibility = ["//visibility:public"], ) cc_library( name = "lib", hdrs = ["lib.hpp"], srcs = ["lib.cc"], deps = [":fmt"], visibility = ["//visibility:public"], linkstatic = 0, ) cc_binary( name = "main", srcs = ["main.cc"], deps = [":lib"], linkstatic = 0, )
验证构建
执行以下命令重新构建:
bazel build //main:main
运行生成的二进制文件:
./bazel-bin/main/main
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

