为什么我的程序在使用 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 run命令时(我使用bazerik(

bazelisk run //lazy-foo-02

我收到一个错误,说找不到我的你好世界。我设法在bazel-bin中找到了一个可执行文件(好吧,在.cache/bazel/…目录结构中的某个位置找到了可执行文件的符号链接。

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

为什么使用bazel-run命令不起作用?BUILD文件中有遗漏吗?

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

感谢

使用C++运行文件库来查找它们。在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");
}

请参阅API文档的头文件,以及关于如何处理子进程、在没有argv[0]的情况下访问它们等的一些说明。@bazel_tools是一个特殊的存储库名称,由bazel自己自动提供,因此不需要对WORKSPACE进行任何更改。

最新更新