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

基于Bzlmod的C++项目引入TensorFlow作为Bazel依赖的问题

问题:Bzlmod模式下配置TensorFlow C++依赖(Mac环境)

我正在启动一个依赖TensorFlow的新C项目,希望通过GitHub导入TensorFlow,避免每个环境手动构建。使用Bazel+Bzlmod管理依赖,但找不到适配的文档。从Java/Node转来,对C构建不熟悉,尝试模仿TensorFlow Serving的配置无效,在CLion同步Bazel时遇到以下错误:

error loading package '@@org_tensorflow~//tensorflow/core': Unable to find package for @@[unknown repo 'local_config_cuda' requested from @@org_tensorflow~]//cuda:build_defs.bzl: The repository '@@[unknown repo 'local_config_cuda' requested from @@org_tensorflow~]' could not be resolved: No repository visible as '@local_config_cuda' from repository '@@org_tensorflow~'. and referenced by '//src/main:my_project_main'

使用MacBook,推测是缺少CUDA组件,需要实现根据操作系统自动开关CUDA(生产环境启用,Mac禁用)。同时不确定C++代码中使用tf.Tensor()、tf.float()等基础类时,应该依赖TensorFlow的哪个Bazel目标。

当前项目配置结构

registry/
  modules/
    org_tensorflow/
      2.15.1/
        MODULE.bazel
        source.json
      metadata.json
    bazel_registry.json
src/
  main/
    BUILD.bazel
    main.cc
.bazelrc
MODULE.bazel
WORKSPACE.bazel

registry已正确配置GitHub归档地址,可正常拉取文件。

.bazelrc 配置

# Enable Bzlmod for every Bazel command
common --enable_bzlmod --registry=https://bcr.bazel.build --registry=file://%workspace%/registry --experimental_repo_remote_exec

MODULE.bazel 配置

module(
    name = "my_project",
    repo_name = "my_project",
)

bazel_dep(name = "bazel_skylib", version = "1.6.1")
bazel_dep(name = "rules_java", version = "7.5.0")
bazel_dep(name = "rules_python", version = "0.31.0")
bazel_dep(name = "org_tensorflow", version = "2.15.1")

WORKSPACE.bazel 配置

load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains")

py_repositories()

python_register_toolchains(
    name = "python",
    ignore_root_user_error = True,
    python_version = "3.9",
)

load("@python//:defs.bzl", "interpreter")
load("@rules_python//python:pip.bzl", "package_annotation", "pip_parse")

NUMPY_ANNOTATIONS = {
    "numpy": package_annotation(
        additive_build_content = """\
filegroup(
    name = "includes",
    srcs = glob(["site-packages/numpy/core/include/**/*.h"]),
)
cc_library(
    name = "numpy_headers",
    hdrs = [":includes"],
    strip_include_prefix="site-packages/numpy/core/include/",
)
""",
    ),
}

pip_parse(
    name = "pypi",
    annotations = NUMPY_ANNOTATIONS,
    python_interpreter_target = interpreter,
    requirements_lock = "@org_tensorflow//:requirements_lock_3_9.txt",
)

load("@pypi//:requirements.bzl", "install_deps")

install_deps()

load("@org_tensorflow//tensorflow:workspace3.bzl", "tf_workspace3")

tf_workspace3()

load("@org_tensorflow//tensorflow:workspace2.bzl", "tf_workspace2")

tf_workspace2()

load("@org_tensorflow//tensorflow:workspace1.bzl", "tf_workspace1")

tf_workspace1()

load("@org_tensorflow//tensorflow:workspace0.bzl", "tf_workspace0")

tf_workspace0()

src/main/BUILD.bazel 配置

cc_binary(
    name = "my_project_main",
    srcs = [
        "main.cc",
    ],
    deps = [
        "@org_tensorflow//tensorflow/core:tensorflow",
    ],
)

更新说明

已创建公开仓库,调整配置后仍出现相同错误。尝试在模块扩展中运行TensorFlow的Python配置文件,但扩展未执行(print日志无输出)。


解决方案

1. 修复CUDA依赖问题(Mac环境禁用CUDA)

在.bazelrc中添加平台条件,自动禁用Mac上的CUDA:

# 针对Mac平台禁用CUDA
build:macos --define=tf_cuda_enable=0
build:macos --define=tf_rocm_enable=0
build:macos --host_force_python=PY3

# 自动识别Mac平台
common --config=macos:darwin

2. 适配Bzlmod的TensorFlow配置

Bzlmod模式下,WORKSPACE中的tf_workspace*调用会和模块系统冲突,需要改用TensorFlow的模块扩展来配置依赖:

  • 修改MODULE.bazel,添加TensorFlow的模块扩展:
module(
    name = "my_project",
    repo_name = "my_project",
)

bazel_dep(name = "bazel_skylib", version = "1.6.1")
bazel_dep(name = "rules_python", version = "0.31.0")

# 加载TensorFlow的模块扩展
load("@org_tensorflow//tensorflow:module_extension.bzl", "tensorflow_module_extension")

tensorflow_module_extension(
    name = "tensorflow",
    version = "2.15.1",
    # 禁用CUDA(Mac环境),生产环境可改为True
    enable_cuda = False,
)
  • 删除WORKSPACE中所有tf_workspace*相关代码,避免和Bzlmod冲突。

3. 确保Python依赖正确配置

在MODULE.bazel中添加Python工具链的模块配置,替代WORKSPACE中的python_register_toolchains:

python.toolchain(
    name = "python",
    python_version = "3.9",
)

正确的依赖目标选择

  • 若使用tf.Tensor()、tf.float()等基础核心类,依赖目标应为@org_tensorflow//tensorflow/core:framework,这个目标包含了TensorFlow核心框架的所有基础类型和API。
  • @org_tensorflow//tensorflow/core:lib是底层工具库,不包含Tensor等核心类,适合仅使用基础工具函数的场景。
  • @org_tensorflow//tensorflow/core:tensorflow是更完整的目标,但包含了较多非必要组件,会增加构建时间。

内容的提问来源于stack exchange,提问作者Lucien Perouze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:46:03