为什么我的程序在使用bazel时找不到资源文件运行 //package

Why can't my programs find resource files when using bazel run //package

如果标题有点含糊,我深表歉意 - 我不知道该怎么表达。

我对 Bazel 很陌生,但我不太明白的一件事是为什么我的程序无法找到我使用 cc_binary 规则

的数据属性指定的资源文件

对于上下文,我正在尝试遵循 Lazy Foo 的 SDL2 教程,我的目录结构有点像这样

gltuts
|
+---lazy-foo-02
|   |
|   +---media
|       |
|       +---hello_world.bmp
|
+---lazy-foo-03

这是我的 BUILD 文件在 lazy-foo-02 目录中的样子

cc_binary(
name = "lazy-foo-02",
  srcs = [
    "main.cpp",
  ],
  data = glob(["media/*"]),
  deps = [
    "//subprojects:sdl2",
  ],
)

当我使用 bazel 运行 命令时(我使用 bazelisk)

bazelisk run //lazy-foo-02

我收到一条错误消息,提示找不到我的 hello_world。我设法在 bazel-bin 中找到了一个可执行文件(以及指向 .cache/bazel/... 目录结构中某处可执行文件的符号链接。

现在符号链接所在的目录有媒体目录,当我从这个符号链接位置执行时,它按预期工作。

为什么这不能使用 bazel 运行 命令?我是否遗漏了 BUILD 文件中的任何内容?

如果需要,我很乐意提供更多信息。

谢谢

使用 C++ runfiles library 找到它们。在您的 BUILD 文件中添加依赖项:

cc_binary(
  name = "lazy-foo-02",
  srcs = [
    "main.cpp",
  ],
  data = glob(["media/*"]),
  deps = [
    "//subprojects:sdl2",
    "@bazel_tools//tools/cpp/runfiles",
  ],
)

然后您的代码需要在哪里找到文件:

#include <string>
#include <memory>
#include "tools/cpp/runfiles/runfiles.h"

using bazel::tools::cpp::runfiles::Runfiles;

int main(int argc, char** argv) {
  std::string error;
  std::unique_ptr<Runfiles> runfiles(
      Runfiles::Create(argv[0], &error));

  if (runfiles == nullptr) {
    return 1  // error handling
  }

  std::string path =
      runfiles->Rlocation("gltuts/lazy-foo-02/media/hello_world.bmp");
}

请参阅 the header file 以获取 API 文档和一些关于如何处理子进程、在没有 argv[0] 的情况下访问它们等的注释。@bazel_tools 是一个特殊的存储库名称,它由 bazel 本身自动提供,因此不需要任何 WORKSPACE 更改。