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

Bazel新手求助:如何用pkg_tar打包头文件与共享库发布自定义库

Bazel新手求助:如何用pkg_tar打包头文件与共享库发布自定义库

嘿,刚接触Bazel就想着打包发布自己的库,这点必须给你点个赞!我来一步步帮你把这个打包流程捋顺,解决你卡壳的地方~

首先得先把基础配置补对:你每个feature目录里的BUILD文件得用cc_library规则,不然根目录的目标没法正确依赖它们。比如feature1/BUILD应该写成这样:

cc_library(
    name = "feature1",
    srcs = ["feature1.cpp"],
    hdrs = ["feature1.hpp"],
    visibility = ["//visibility:public"],  # 确保根目录的BUILD能引用这个库
)

feature2和feature3的BUILD照这个格式改,替换对应的文件名就行。

接下来处理头文件的打包:你根目录里的filegroup需要用glob匹配所有子目录的头文件,这样后续新增子目录也不用手动改规则。补全后的代码如下:

filegroup(
    name = "headers",
    srcs = glob([
        "feature1/*.hpp",
        "feature2/*.hpp",
        "feature3/*.hpp",
        # 以后加新子目录的话,直接加类似行,或者用**/*.hpp匹配所有子目录的.hpp文件
    ]),
    # 小提示:如果想让头文件在include目录下保留feature1/feature2的层级结构,就不用加strip_prefix;
    # 如果想把所有.hpp直接放到include根目录,就加上strip_prefix = "."
)

然后补全你写了一半的头文件tar包规则:

pkg_tar(
    name = "headers_pkg",
    srcs = [":headers"],
    package_dir = "include",
)

接下来处理共享库的打包:你已经用linkshared = True生成了共享库,现在要把它放到tar包的lib目录里,新增一个pkg_tar规则:

pkg_tar(
    name = "lib_pkg",
    srcs = [":feature"],
    package_dir = "lib",
    preserve_symlinks = True,  # 保留Bazel生成的符号链接(比如libfeature.so指向实际的版本化so文件)
)

最后把两个tar包合并成一个最终的tar.gz,这样用户拿到手就是标准的lib/+include/结构:

pkg_tar(
    name = "library_package",
    srcs = [":headers_pkg", ":lib_pkg"],
    extension = "tar.gz",
)

现在只要运行这条命令就能生成你要的包了:

bazel build //:library_package

生成的library_package.tar.gz会放在bazel-bin/目录下,解压后就能直接用啦~

备注:内容来源于stack exchange,提问作者Darren Sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:53:10