在Bazel中提供第三方库访问的正确方式——以glm为例
解决方案
要实现用#include "third_party/glm/glm.hpp"引用头文件且不修改现有目录结构,可通过以下两种折中方案调整Bazel配置:
方案一:移除new_local_repository,直接在项目内定义库
这种方式贴合项目目录结构,避免外部仓库的路径混淆:
修改WORKSPACE文件
删除原有的new_local_repository配置块。修改
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,调整包含路径映射
如果需要保留外部仓库的配置,可通过调整包含路径实现:
- 修改
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"], )
- WORKSPACE文件保持不变
原有的new_local_repository配置无需修改。
这样配置后,编译器会从项目根目录查找third_party/glm/glm.hpp,实际映射到third_party/glm/local/glm/glm.hpp,满足需求且不改动目录结构。
内容的提问来源于stack exchange,提问作者Mohammad Nasirifar
相关产品推荐
相关产品推荐

