我有一个(基本的)C++项目:
??? bin
? ??? BUILD
? ??? example.cpp
??? data
? ??? someData.txt
??? WORKSPACE
Run Code Online (Sandbox Code Playgroud)
可执行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;
}
Run Code Online (Sandbox Code Playgroud)
我的Bazel设置是最小的:
cc_binary(name = "example",srcs = ["example.cpp"])Hello_world!行问题是Bazel将所有这些文件移动到特殊位置:
.
??? bazel-Bazel_with_Data -> ...
??? bazel-bin -> ...
??? bazel-genfiles -> ...
??? bazel-out -> ...
??? bazel-testlogs -> ...
Run Code Online (Sandbox Code Playgroud)
在特殊情况下,示例可执行文件将找不到data/someData.txt文件:
bazel run bin:example
Run Code Online (Sandbox Code Playgroud)
将打印:
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
Run Code Online (Sandbox Code Playgroud)
问题是如何管理这个?
我希望示例可执行文件能够找到Data/someData.txt文件.
注意:这个解决方案似乎在 Windows 下不起作用(请参阅评论)。
\n\n必须在数据目录中创建一个额外的BUILD文件来定义必须导出哪些数据文件。现在的项目结构是:
\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 BUILD\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example.cpp\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 data\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 BUILD\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 someData.txt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WORKSPACE\nRun Code Online (Sandbox Code Playgroud)\n\n这个新的数据/构建文件是:
\n\nexports_files(["someData.txt"])\nRun Code Online (Sandbox Code Playgroud)\n\n并且修改bin/BUILD文件以添加someData.txt依赖项:
\n\ncc_binary(\n name = "example",\n srcs = ["example.cpp"],\n data = ["//data:someData.txt"],\n)\nRun Code Online (Sandbox Code Playgroud)\n\n现在如果你运行:
\n\nbazel run bin:example\nRun Code Online (Sandbox Code Playgroud)\n\n你应该得到:
\n\nINFO: Analysed target //bin:example (2 packages loaded).\nINFO: Found 1 target...\nTarget //bin:example up-to-date:\n bazel-bin/bin/example\nINFO: Elapsed time: 0.144s, Critical Path: 0.01s\nINFO: Build completed successfully, 3 total actions\n\nINFO: Running command line: bazel-bin/bin/example\nHello_world!\nRun Code Online (Sandbox Code Playgroud)\n\n这意味着示例可执行文件已找到data/someData.txt文件并打印其内容。
\n\n另请注意,您可以使用相同的方案进行单元测试
\n\n cc_test(...,data =["//data:someData.txt"], )\nRun Code Online (Sandbox Code Playgroud)\n\n您可以从此GitHub 存储库复制此说明。
\n| 归档时间: |
|
| 查看次数: |
1206 次 |
| 最近记录: |