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", ], )
解决方法
问题根源
- 依赖缺失:gtkmm基于glibmm开发,未引入glibmm导致
glibmm/utility.h这类依赖头文件找不到。 - WORKSPACE配置错误:
strip_prefix直接截取到gtkmm-4.8.0/gtk,破坏了原项目的目录结构,导致头文件路径索引混乱。 - 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
相关产品推荐
相关产品推荐

