如何用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
相关产品推荐
相关产品推荐

