c++ - 在 Bazel 中移动文件

标签 c++ ubuntu bazel

我在 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"],
)

目录结构如下。

Folder directory

最佳答案

更新

要将数据文件复制到与二进制文件相同的目录,可以使用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/

相关文章:

ubuntu - 使用 Webmin 挂载 NFS 时权限被拒绝(Mac OSX + Ubuntu 设置)

ubuntu - Pyenv:没有这样的命令 `version-name'

centos - 在 CentOS 6.5 上构建 bazel 时出错 F_SETLK

C++: "Expected ' (' for function-style cast or type construction"错误

linux - Lex分析器,用于生成文件,但不生成带有词法错误消息的程序列表

c++ - boost::python 是如何工作的?关于实现细节有什么想法吗?

c++ - 如何使用 Eigen 和 Bazel 构建一个简单的 C++ 演示?

testing - 修改 tensorflow 源代码的良好做法

c++ - 如何检测 Windows 系统托盘的变化?

c++ - 如何从另一个类启动角色