如果标题有点模糊,我深表歉意-我不知道该怎么表达。
我是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
进行任何更改。