我在 ubuntu 18.04 上使用 bazel(0.22 版)构建 C++ 代码。
main.cpp 有一个读取 ui 文件的 api 读取 ui 文件。
API 如下所示
auto ui_data = readUIData("Front_end.ui");
我能够构建代码。但由于“Front_end.ui”文件始终位于 bin 文件夹中的 ui/Front_end.ui 路径中,而 exe 位于上面给出的“ui”文件夹之外,因此 C++ 代码片段失败。
以下是 BUILD 文件片段
cc_binary(
name = "UI_exe",
srcs = ["bin/main.cpp"],
data = ["ui/Front_end.ui"],
)
目录结构如下。
最佳答案
更新
要将数据文件复制到与二进制文件相同的目录,可以使用genrule:
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
.
关于c++ - 在 Bazel 中移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54883204/