在巴泽尔移动文件
Moving files in Bazel
我在ubuntu 18.04上使用bazel(0.22版本)来构建C++代码。
main.cpp有一个用于读取ui文件的api,该api读取ui文件。
Api看起来像低于
auto ui_data = readUIData("Front_end.ui");
我能够构建代码。但是,由于"Front_end.ui"文件始终位于bin文件夹中的ui/Front_end.ui路径中,并且exe位于上面的"ui"文件夹之外,因此给定的c++代码片段失败。
以下是BUILD文件片段
cc_binary(
name = "UI_exe",
srcs = ["bin/main.cpp"],
data = ["ui/Front_end.ui"],
)
以下是目录结构。
文件夹目录
更新
要将数据文件复制到与二进制文件相同的目录,可以使用genrule:
genrule(
name = "copy",
srcs = ["ui/Front_end.ui"],
outs = ["Front_end.ui"],
output_to_bindir = 1,
cmd = "cp $< $@",
)
由于只有一个srcs
和一个outs
条目,因此可以分别使用$<
和$@
。
(否则,您将不得不使用$(location ...)
表达式。Bazel将这些表达式替换为文件的实际路径,无论该路径在构建时是什么。)
您需要使用C++运行文件库。文档在源文件中。
一旦初始化了std::unique_ptr<Runfiles> runfiles
,就可以查找文件的运行时路径,如下所示:
std::string path = runfiles->Rlocation("my_workspace/my_package_path/ui/Front_end.ui");
您必须将my_workspace
替换为工作区的名称,将my_package_path
替换为二进制文件的包路径。
工作区名称
例如,如果WORKSPACE
文件包含workspace(name = "foo")
,则my_workspace
应该是foo
。如果WORKSPACE
文件中没有这样的规则,则使用默认的工作区名称:__main__
。
程序包路径
这是BUILD文件的工作区根相对路径,您在该文件中定义了cc_binary,例如示例中的"app/BILD"。所以my_package_path
应该只是app
。
相关文章:
- 复制文件成功,移动文件失败,参数相同 - C++
- 错误:移动文件时'QString'为非标量类型"std::__cxx11::字符串"
- 快速从文件中读取下一个字符串,而无需移动文件的位置
- 如何使用C++在 Linux 中移动文件
- QT-如何移动文件
- 在巴泽尔移动文件
- C++:无法移动文件,因为文件夹名称上有空格
- 在C++中查找和移动文件
- 同时在Visual Studio和AnkhSVN中移动文件
- 使用SetFileInformationByHandle移动文件
- 在 matlab 中移动文件
- 在 Linux 中使用 C++ 跨卷移动文件
- 移动文件A()不喜欢我的参数
- C++ Windows 7上的移动文件错误(2)
- 为什么std::istream::read不根据读取的字节移动文件指针
- 是否可以使用FindFirstFile()来移动文件
- 读取文件:如何使用fscanf移动文件指针,以及scanf/fscanf如何处理丢失的%类型
- 移动文件() 不起作用
- 移动文件夹Windows c++:适用于Vista及以上版本,不包括XP
- 尝试使用带有C++的MoveFile移动文件时出现ERROR_INVALID_NAME