gpt4 book ai didi

带有数据存储库的 C++ Bazel 项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:02 25 4
gpt4 key购买 nike

我有一个(基本的)C++ 项目:

├── bin
│   ├── BUILD
│   ├── example.cpp
├── data
│   └── someData.txt
└── WORKSPACE

可执行文件 example.cpp 使用 data/ 目录中的一些数据文件:

#include <fstream>
#include <iostream>

int main()
{
std::ifstream in("data/someData.txt");

if (!in)
{
std::cerr << "Can not open file!";
return EXIT_FAILURE;
}

std::string message;

if (!(in >> message))
{
std::cerr << "Can not read file content!";
return EXIT_FAILURE;
}

std::cout << message << std::endl;

return EXIT_SUCCESS;
}

我的 Bazel 设置是最小的:

  • WORKSPACE:空文件
  • bin/BUILD:cc_binary(name = "example",srcs = ["example.cpp"])
  • data/someData.txt:包含 Hello_world!

问题是 Bazel 将所有这些文件移动到特殊位置:

.
├── bazel-Bazel_with_Data -> ...
├── bazel-bin -> ...
├── bazel-genfiles -> ...
├── bazel-out -> ...
├── bazel-testlogs -> ...

特别是 example 可执行文件将找不到 data/someData.txt 文件:

bazel run bin:example

将打印:

INFO: Analysed target //bin:example (0 packages loaded).
INFO: Found 1 target...
Target //bin:example up-to-date:
bazel-bin/bin/example
INFO: Elapsed time: 0.101s, Critical Path: 0.00s
INFO: Build completed successfully, 1 total action

INFO: Running command line: bazel-bin/bin/example
Can not open file!ERROR: Non-zero return code '1' from command: Process exited with status 1

问题是如何管理它?

我希望示例 可执行文件能够找到Data/someData.txt 文件。

最佳答案

注意:这个解决方案似乎在 Windows 下不起作用(见评论)。

必须在 data 目录中创建一个额外的 BUILD 文件,用于定义必须导出的数据文件。现在的项目结构是:

├── bin
│   ├── BUILD
│   ├── example.cpp
├── data
│   ├── BUILD
│   └── someData.txt
└── WORKSPACE

这个新的data/BUILD 文件是:

exports_files(["someData.txt"])

并且修改bin/BUILD文件,添加someData.txt依赖:

cc_binary(
name = "example",
srcs = ["example.cpp"],
data = ["//data:someData.txt"],
)

现在如果你运行:

bazel run bin:example

你应该得到:

INFO: Analysed target //bin:example (2 packages loaded).
INFO: Found 1 target...
Target //bin:example up-to-date:
bazel-bin/bin/example
INFO: Elapsed time: 0.144s, Critical Path: 0.01s
INFO: Build completed successfully, 3 total actions

INFO: Running command line: bazel-bin/bin/example
Hello_world!

意味着example 可执行文件找到了data/someData.txt 文件并打印了它的内容。

另请注意,您可以使用与

相同的 单元测试方案
 cc_test(...,data =["//data:someData.txt"], )

您可以从这个 GitHub repo 复制这个注释.

关于带有数据存储库的 C++ Bazel 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46100906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com