我正在ubuntu 18.04上使用bazel(0.22版)来构建C ++代码。
main.cpp具有用于读取ui文件的api,该ui文件读取ui文件。
Api如下图
auto ui_data = readUIData("Front_end.ui");
我能够构建代码。但是由于“ Front_end.ui”文件始终位于bin文件夹的ui / Front_end.ui路径中,而exe在给定的c ++代码段上方的“ ui”文件夹之外。
以下是BUILD文件片段
cc_binary(
name = "UI_exe",
srcs = ["bin/main.cpp"],
data = ["ui/Front_end.ui"],
)
以下是目录结构。
答案 0 :(得分:1)
要将数据文件复制到与二进制文件相同的目录中,可以使用一种规则:
genrule(
name = "copy",
srcs = ["ui/Front_end.ui"],
outs = ["Front_end.ui"],
output_to_bindir = 1,
cmd = "cp $< $@",
)
由于只有一个srcs
和一个outs
条目,因此您可以分别使用$<
和$@
。
(否则,您将不得不使用$(location ...)
表达式。Bazel会将这些表达式替换为文件的实际路径,无论构建时路径可能是什么。)
您需要使用C++ runfiles library。源文件中有文档。
初始化std::unique_ptr<Runfiles> runfiles
后,您可以像下面这样查找文件的运行时路径:
std::string path = runfiles->Rlocation("my_workspace/my_package_path/ui/Front_end.ui");
您必须将my_workspace
替换为工作空间的名称,并将my_package_path
替换为二进制文件的打包路径。
例如,如果WORKSPACE
文件包含workspace(name = "foo")
,则my_workspace
应该是foo
。如果WORKSPACE
文件中没有这样的规则,请使用默认工作区名称:__main__
。
这是您在其中定义cc_binary的BUILD文件的工作区根相对路径,例如在您的示例中为“ app / BUILD”。因此my_package_path
应该只是app
。