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

如何用Bazel为C++项目添加wxWidgets依赖及编译错误排查

解决Bazel构建wxWidgets项目时找不到wx/setup.h的问题

问题背景

我正在开发一个依赖wxWidgets的C++项目,原本通过wxWidgets文档中的Makefile可以正常编译。改用Bazel作为构建系统后,运行bazel build //src:app --verbose_failures出现编译错误:找不到wx/setup.h头文件。

错误信息

In file included from external/wx/wx/defs.h:45,
                 from external/wx/wx/memory.h:14,
                 from external/wx/wx/object.h:19,
                 from external/wx/wx/utils.h:18,
                 from external/wx/wx/thrimpl.cpp:344:
external/wx/wx/platform.h:159:10: fatal error: wx/setup.h: No such file or directory
  159 | #include "wx/setup.h"
      |          ^~~~~~~~~~~~

当前配置文件

WORKSPACE文件

new_local_repository(
  name="wx",
  path="/usr/include/wx-3.2",

  build_file_content = """
package(default_visibility = ["//visibility:public"])
cc_library(
    name = "headers",
    hdrs = glob(["**/*.h"]),
    srcs = glob(["**/*.cpp"]),
    includes = ["/usr/include/wx-3.2"],
)
"""
)

new_local_repository(
  name="gtk-unicode",
  path="/usr/lib/wx/include/gtk3-unicode-3.2",

  build_file_content = """
package(default_visibility = ["//visibility:public"])
cc_library(
    name = "headers",
    hdrs = glob(["**/*.h"])
)
"""
)

src/BUILD文件

cc_library(
  name="agent",
  srcs=["Agent.cpp"],
  hdrs=["Agent.h"],
  deps=[":game"]
)

cc_library(
  name="game",
  srcs=["Game.cpp"],
  hdrs=["Game.h"],
)

cc_binary(
  name="app",
  srcs=["App.cpp"],
  deps=[":agent", ":game", "@wx//:headers", "@gtk-unicode//:headers"],
  copts=[
    "-Iexternal/wx",
    "-Iexternal/gtk-unicode",
    "-DWXUSINGDLL",
    "-D__WXGTK3__",
    "-D__WXGTK__",
    "-pthread",
    "-lwx_gtk3u_xrc-3.2",
    "-lwx_gtk3u_html-3.2",
    "-lwx_gtk3u_qa-3.2",
    "-lwx_gtk3u_core-3.2",
    "-lwx_baseu_xml-3.2",
    "-lwx_baseu_net-3.2",
    "-lwx_baseu-3.2"
  ]
)

解决方案

1. 修正WORKSPACE的include路径配置

wx/setup.h实际位于/usr/lib/wx/include/gtk3-unicode-3.2/wx/路径下,原配置未让Bazel正确识别该路径。修改两个仓库的includes为相对路径:

new_local_repository(
  name="wx",
  path="/usr/include/wx-3.2",
  build_file_content = """
package(default_visibility = ["//visibility:public"])
cc_library(
    name = "headers",
    hdrs = glob(["**/*.h"]),
    srcs = glob(["**/*.cpp"]),
    includes = ["."],
)
"""
)

new_local_repository(
  name="gtk-unicode",
  path="/usr/lib/wx/include/gtk3-unicode-3.2",
  build_file_content = """
package(default_visibility = ["//visibility:public"])
cc_library(
    name = "headers",
    hdrs = glob(["**/*.h"]),
    includes = ["."],
)
"""
)

2. 优化BUILD文件的编译与链接选项

  • 移除冗余的-Iexternal/wx和-Iexternal/gtk-unicode,依赖库已通过includes提供头文件路径
  • 将链接库参数从copts移至linkopts(copts用于编译选项,linkopts用于链接选项)

修改后的src/BUILD:

cc_library(
  name="agent",
  srcs=["Agent.cpp"],
  hdrs=["Agent.h"],
  deps=[":game"]
)

cc_library(
  name="game",
  srcs=["Game.cpp"],
  hdrs=["Game.h"],
)

cc_binary(
  name="app",
  srcs=["App.cpp"],
  deps=[":agent", ":game", "@wx//:headers", "@gtk-unicode//:headers"],
  copts=[
    "-DWXUSINGDLL",
    "-D__WXGTK3__",
    "-D__WXGTK__",
    "-pthread"
  ],
  linkopts=[
    "-lwx_gtk3u_xrc-3.2",
    "-lwx_gtk3u_html-3.2",
    "-lwx_gtk3u_qa-3.2",
    "-lwx_gtk3u_core-3.2",
    "-lwx_baseu_xml-3.2",
    "-lwx_baseu_net-3.2",
    "-lwx_baseu-3.2"
  ]
)

3. 原理说明

  • 给gtk-unicode仓库添加includes = ["."]后,Bazel会将该仓库根目录加入头文件搜索路径,#include "wx/setup.h"就能被正确定位
  • wx仓库改用相对路径includes = ["."],避免绝对路径导致的依赖定位问题
  • 分离编译与链接选项,符合Bazel的构建规则,减少配置混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:14:58