我正在做一个依赖wxWidgets的C++项目。
我可以使用wxWidgets文档中的以下Makefile编译应用程序:
PROGRAM = App
OBJECTS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
# implementation
.SUFFIXES: .o .cpp
.cpp.o :
$(CXX) -O2 -g -c `wx-config --cxxflags` -o $@ $<
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) -O2 -g -o $(PROGRAM) $(OBJECTS) `wx-config --libs`
clean:
rm -f *.o $(PROGRAM)
字符串
但是,我决定尝试bazel作为我的构建系统。
运行`bazel build //src:app --verbose_failures时出现以下错误:
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"
]
)
型
2条答案
按热度按时间8fsztsew1#
我不知道是否有一些优雅的方式告诉bazel自己执行
wx-config
,但在最坏的情况下,您可以将wx-config --cxxflags
的输出复制并粘贴到includes
赋值中(对于--libs
也是如此)。knsnq2tg2#
回答这个问题的困难在于,wxwidgets提供了一种开箱即用的编译和链接方法,这与Bazel的哲学背道而驰。步骤有很大的不同,这取决于你的平台。从本质上讲,当您安装wxwidgets时,无论是从源代码编译还是从预制的OS包编译,它都附带了wx-config实用程序,该实用程序将通过shell命令生成编译器工作所需的标志。
然而,在Bazel中,您需要向Bazel本身声明源代码、头文件和定义,然后它将推导出编译器标志。要使其工作,您需要推断wx-config生成的标志在您的平台中的含义,然后在Bazel中编写它们。下面是我在Ubuntu 22.04中对wxwidgets包所做的。
wx-config --cxxflags的输出是:
字符串
请注意,有两个包含文件夹、三个定义和-pthread编译器选项。对于wx-config --libs,我们有:
型
这里我们只有一个库文件夹,Linux中的标志-lfoo转换为libfoo. so。
无论如何,当我们将其转换为Bazel时,我们需要将以下repos添加到WORKSPACE文件中:
型
对于wxheaders.BUILD文件,将您能找到的所有头文件放在文件夹中:
型
对于wxwidgets.BUILD文件,我们有头文件和共享库,我们可以使用
型
最后,当你要构建一个二进制文件时,在copts中添加缺少的-pthread(我们不能在依赖项中添加它,因为它不会传播)。BUILD文件应该如下所示:
型
另一种方法是在.bazelrc文件中添加-pthread copt,如果您同意在整个项目中使用它的话。有几种方法可以做到这一点。
如前所述,具体步骤将在很大程度上取决于您的操作系统以及您如何安装wxwidgets,但我希望这个示例可以帮助您入门。