You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Bazel中提供第三方库访问的正确方式——以glm为例

解决方案

要实现用#include "third_party/glm/glm.hpp"引用头文件且不修改现有目录结构,可通过以下两种折中方案调整Bazel配置:

方案一:移除new_local_repository,直接在项目内定义库

这种方式贴合项目目录结构,避免外部仓库的路径混淆:

  1. 修改WORKSPACE文件
    删除原有的new_local_repository配置块。

  2. 修改third_party/glm/BUILD文件
    调整cc_library的includes和strip_include_prefix属性,将头文件路径映射到third_party/glm下:

cc_library(
    name = "glm",
    srcs = ["local/glm/detail/glm.cpp"],
    hdrs = glob([
        "local/glm/**/*.hpp",
        "local/glm/**/*.h",
        "local/glm/**/*.inl",
    ]),
    # 将third_party/glm加入包含路径
    includes = ["third_party/glm"],
    # 去掉头文件路径中的local/glm前缀,让glm.hpp直接对应到third_party/glm/glm.hpp
    strip_include_prefix = "local/glm",
    visibility = ["//visibility:public"],
)

配置完成后,即可通过#include "third_party/glm/glm.hpp"引用头文件,原目录结构完全保留。

方案二:保留new_local_repository,调整包含路径映射

如果需要保留外部仓库的配置,可通过调整包含路径实现:

  1. 修改third_party/glm/BUILD文件
    由于new_local_repository的根目录是third_party/glm/local,需调整includes指向项目根目录,并修正文件路径:
cc_library(
    name = "glm",
    # 仓库根是local,直接写glm/...即可定位到文件
    srcs = ["glm/detail/glm.cpp"],
    hdrs = glob([
        "glm/**/*.hpp",
        "glm/**/*.h",
        "glm/**/*.inl",
    ]),
    # 相对于仓库根(third_party/glm/local),../..指向项目根目录
    includes = ["../.."],
    # 去掉glm前缀,让头文件路径对应到third_party/glm下
    strip_include_prefix = "glm",
    visibility = ["//visibility:public"],
)
  1. WORKSPACE文件保持不变
    原有的new_local_repository配置无需修改。

这样配置后,编译器会从项目根目录查找third_party/glm/glm.hpp,实际映射到third_party/glm/local/glm/glm.hpp,满足需求且不改动目录结构。


内容的提问来源于stack exchange,提问作者Mohammad Nasirifar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:30:39