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

Bazel集成gtkmm库时缺失依赖引发头文件找不到问题

问题:Bazel引入gtkmm库时出现头文件缺失编译错误

编译时频繁出现头文件找不到的错误,例如:

Showing Recent Messages
../mediapipe/external/gtkmm/gtkmm/accelerator.cc:18:10: fatal error: 'glibmm/utility.h' file not found
#include <glibmm/utility.h>
         ^~~~~~~~~~~~~~~~~~
1 error generated.
Error in child process '/usr/bin/xcrun'. 1
Aspect @tulsi//:tulsi/tulsi_aspects.bzl%tulsi_outputs_aspect of //mediapipe/examples/motionize/motionize:motionize up-to-date:
  bazel-bin/mediapipe/examples/motionize/motionize/motionize.tulsiouts
/private/var/tmp/_bazel_{user}/5a416b3c18d355cbf1dfbcf0102ffc0b/external/gtkmm/BUILD.bazel:7:11: Compiling gtkmm/accelerator.cc failed: (Aborted): wrapped_clang_pp failed: error executing command 
Elapsed time: 10.459s, Critical Path: 0.45s
12 processes: 12 internal.
<*> Running Bazel completed in 10826.492 ms
Build did NOT complete successfully

环境说明:使用Tulsi创建Bazel Xcode项目,尝试过调整配置、改用本地仓库替代http_archive,问题依然存在。

当前配置文件如下:

WORKSPACE 文件

http_archive(
    name = "gtkmm",
    strip_prefix = "gtkmm-4.8.0/gtk",
    urls = ["https://github.com/GNOME/gtkmm/archive/refs/tags/4.8.0.zip"],
    build_file = "@//third_party:gtkmm.BUILD",
)

third_party/gtkmm.BUILD 文件

package(default_visibility = ["//visibility:public"])

licenses(["notice"])  # BSD license

exports_files(["LICENSE"])

cc_library(
    name = "main",
    srcs = glob(
        ["**/*.cc"],
    ),
    hdrs = glob([
        "*.h",
        "gtkmm/**/object_p.h",
        "**/*.hg",
        "**/*.h",
        "**/selectiondata_private.h"
    ]),
    includes = glob([
        "*.h",
        "gtkmm/**/object_p.h",
        "**/*.hg",
        "**/*.h",
        "**/selectiondata_private.h"

    ]),
    copts = ["-Iexternal/gtkmm-4.8.0/gtk"],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

项目BUILD文件

cc_binary(
    name="motionize",
    srcs=["main.cpp"],
    copts = [
        "-Iexternal/gtkmm-4.8.0/gtk/gtkmm",
        "-Iexternal/gtkmm-4.8.0/gtk/",
        "-Iexternal/gtkmm-4.8.0/gtk/src",
        "-Iexternal/gtkmm-4.8.0/gtk/gtkmm/private",
        ],
    deps=[
        "//mediapipe/framework:calculator_framework",
        "//mediapipe/calculators/core:pass_through_calculator",
        "//mediapipe/calculators/image:image_cropping_calculator",
        "//mediapipe/calculators/image:scale_image_calculator",
        "//mediapipe/framework/formats:image_frame",
        "//mediapipe/framework/formats:image_frame_opencv",
        "//mediapipe/framework/port:opencv_core",
        "//mediapipe/framework/port:opencv_highgui",
        "//mediapipe/framework/port:opencv_imgproc",
        "//mediapipe/framework/port:opencv_imgcodecs",
        "//mediapipe/framework/port:opencv_video",
        "//mediapipe/framework/port:parse_text_proto",
        "//mediapipe/framework/port:status",
        "@gtkmm//:main",
    ],
)
解决方法

问题根源

  1. 依赖缺失:gtkmm基于glibmm开发,未引入glibmm导致glibmm/utility.h这类依赖头文件找不到。
  2. WORKSPACE配置错误:strip_prefix直接截取到gtkmm-4.8.0/gtk,破坏了原项目的目录结构,导致头文件路径索引混乱。
  3. BUILD文件配置错误:includes字段指定的是文件而非目录;硬编码的copts路径不可靠,且未通过依赖传递处理头文件路径。

修正后的配置

1. 更新WORKSPACE文件(补充glibmm依赖)

# 引入glibmm(gtkmm的核心依赖)
http_archive(
    name = "glibmm",
    strip_prefix = "glibmm-2.76.0",
    urls = ["https://github.com/GNOME/glibmm/archive/refs/tags/2.76.0.zip"],
    build_file = "@//third_party:glibmm.BUILD",
)

# 修正gtkmm的strip_prefix,保留完整项目结构
http_archive(
    name = "gtkmm",
    strip_prefix = "gtkmm-4.8.0",
    urls = ["https://github.com/GNOME/gtkmm/archive/refs/tags/4.8.0.zip"],
    build_file = "@//third_party:gtkmm.BUILD",
)

2. 创建third_party/glibmm.BUILD文件

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

cc_library(
    name = "main",
    srcs = glob(["**/*.cc"]),
    hdrs = glob(["**/*.h", "**/*.hg"]),
    includes = [
        ".",
        "glibmm",
        "giomm",
    ],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

3. 修正third_party/gtkmm.BUILD文件

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

exports_files(["LICENSE"])

cc_library(
    name = "main",
    srcs = glob(["gtk/**/*.cc"]),
    hdrs = glob(["gtk/**/*.h", "gtk/**/*.hg"]),
    includes = [
        "gtk",
        "gtk/gtkmm",
        "gtk/src",
    ],
    linkopts = ["-pthread"],
    # 添加glibmm依赖,让其头文件路径自动生效
    deps = ["@glibmm//:main"],
    visibility = ["//visibility:public"],
)

4. 简化项目BUILD文件(移除硬编码copts)

cc_binary(
    name="motionize",
    srcs=["main.cpp"],
    deps=[
        "//mediapipe/framework:calculator_framework",
        "//mediapipe/calculators/core:pass_through_calculator",
        "//mediapipe/calculators/image:image_cropping_calculator",
        "//mediapipe/calculators/image:scale_image_calculator",
        "//mediapipe/framework/formats:image_frame",
        "//mediapipe/framework/formats:image_frame_opencv",
        "//mediapipe/framework/port:opencv_core",
        "//mediapipe/framework/port:opencv_highgui",
        "//mediapipe/framework/port:opencv_imgproc",
        "//mediapipe/framework/port:opencv_imgcodecs",
        "//mediapipe/framework/port:opencv_video",
        "//mediapipe/framework/port:parse_text_proto",
        "//mediapipe/framework/port:status",
        "@gtkmm//:main",
    ],
)

关键修复说明

  • 补充glibmm依赖:gtkmm的所有核心功能都依赖glibmm,必须引入该库才能解决基础头文件缺失问题。
  • 修正strip_prefix:保留gtkmm的完整项目目录结构,确保BUILD文件能正确索引所有源文件和头文件。
  • 调整includes字段:指定头文件所在的目录而非单个文件,让编译器能自动检索这些目录下的头文件。
  • 移除硬编码copts:Bazel会通过依赖链自动传递头文件路径,无需手动指定external下的绝对路径,避免路径错误和环境兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:15:34