C++ 在Bazel中移动文件

C++ 在Bazel中移动文件,c++,ubuntu,bazel,C++,Ubuntu,Bazel,我在Ubuntu 18.04上使用BAZEL(0.22版本)来构建C++代码。 main.cpp有一个用于读取ui文件的api,该api读取ui文件 Api如下所示 auto ui_data = readUIData("Front_end.ui"); 我能够构建代码。但是由于“FruttUnEn.UI”文件始终驻留在UI /FruttJEnter中。bin文件夹和exe中的UI路径位于上面的“UI”文件夹之外,因此C++代码片段失败。 以下是构建文件片段 cc_binary( name = "

我在Ubuntu 18.04上使用BAZEL(0.22版本)来构建C++代码。 main.cpp有一个用于读取ui文件的api,该api读取ui文件

Api如下所示

auto ui_data = readUIData("Front_end.ui");
我能够构建代码。但是由于“FruttUnEn.UI”文件始终驻留在UI /FruttJEnter中。bin文件夹和exe中的UI路径位于上面的“UI”文件夹之外,因此C++代码片段失败。 以下是构建文件片段

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 $< $@",
)
您必须将
my_workspace
替换为工作区的名称,并将
my_package_path
替换为二进制文件的包路径

工作空间名 例如,如果
WORKSPACE
文件包含
WORKSPACE(name=“foo”)
,则
my\u WORKSPACE
应为
foo
。如果
工作区
文件中没有此类规则,则使用默认的工作区名称:
\uuuuu main\uuuu

包路径 这是相对于构建文件的工作区根路径,您在其中定义了cc_二进制文件,例如示例中的“app/BUILD”。所以
my\u package\u path
应该只是
app

更新 要将数据文件复制到与二进制文件相同的目录,可以使用genrule:

genrule(
    name = "copy",
    srcs = ["ui/Front_end.ui"],
    outs = ["Front_end.ui"],
    output_to_bindir = 1,
    cmd = "cp $< $@",
)
您必须将
my_workspace
替换为工作区的名称,并将
my_package_path
替换为二进制文件的包路径

工作空间名 例如,如果
WORKSPACE
文件包含
WORKSPACE(name=“foo”)
,则
my\u WORKSPACE
应为
foo
。如果
工作区
文件中没有此类规则,则使用默认的工作区名称:
\uuuuu main\uuuu

包路径
这是相对于构建文件的工作区根路径,您在其中定义了cc_二进制文件,例如示例中的“app/BUILD”。所以
my_package\u path
应该是
app

不要使用相对路径。您不应该对文件相对于当前工作目录的位置做出任何假设。(例如,不管用户是说
/tmp/a.out
还是
(cd/tmp&&/a.out)
,都不关你的事)将路径设置为可配置的,并将其作为命令行标志传入。@KerrekSB:谢谢你的输入。但是,在不修改main.cpp中的代码的情况下,是否有解决方法呢?正如我所说,没有这样的事情是有意义的。您无法控制可执行文件的运行方式。在代码中加入这样的假设是完全错误的。不要使用相对路径。您不应该对文件相对于当前工作目录的位置做出任何假设。(例如,不管用户是说
/tmp/a.out
还是
(cd/tmp&&/a.out)
,都不关你的事)将路径设置为可配置的,并将其作为命令行标志传入。@KerrekSB:谢谢你的输入。但是,在不修改main.cpp中的代码的情况下,是否有解决方法呢?正如我所说,没有这样的事情是有意义的。您无法控制可执行文件的运行方式。在代码中加入这样的假设是完全错误的。谢谢你的输入。但是我不想打扰main.cpp。相反,我想在bazel中找到一种方法,将exe和“Front_end.ui”获取到bin文件夹中的同一路径。不更改代码的原因是,此项目是使用bazel(由某些用户)和cmake(由其他用户)构建的。但在这里,我们创建了一个名为“out”的新输出文件夹,然后将.exe和.ui文件复制到那里。是一种只将.ui移动到.exe文件路径中的方法。是的,这是可能的,我更新了
genrule
来实现这一点。谢谢,这正是我想要的。这就解决了问题!!!谢谢拉兹洛:)谢谢你的意见。但是我不想打扰main.cpp。相反,我想在bazel中找到一种方法,将exe和“Front_end.ui”获取到bin文件夹中的同一路径。不更改代码的原因是,此项目是使用bazel(由某些用户)和cmake(由其他用户)构建的。但在这里,我们创建了一个名为“out”的新输出文件夹,然后将.exe和.ui文件复制到那里。是一种只将.ui移动到.exe文件路径中的方法。是的,这是可能的,我更新了
genrule
来实现这一点。谢谢,这正是我想要的。这就解决了问题!!!谢谢拉兹洛:)