为什么我的程序在使用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
更改。
如果标题有点含糊,我深表歉意 - 我不知道该怎么表达。
我对 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
更改。