Bazel 的 Mingw-w64 工具链 (Ubuntu 20.04.1 )

2024-01-02

我正在尝试使用 Bazel 在 Ubuntu 上为 mingw-w64 创建工具链。我正在关注这个教程:https://docs.bazel.build/versions/master/tutorial/cc-toolchain-config.html https://docs.bazel.build/versions/master/tutorial/cc-toolchain-config.html。但是,当我尝试将编译器的路径调整为 mingw64 安装的路径时,出现以下错误:

bazel build --config=mingw_config -s //main:hello-world --verbose_failures
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (16 packages loaded, 46 targets configured).
INFO: Found 1 target...
SUBCOMMAND: # //main:hello-world [action 'Compiling main/hello-world.cc', configuration: a79594d39f0782b210e102e89b8a67dda26e295f95805aa9c0140f6281fdd3f5, execution platform: @local_config_platform//:host]
(cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
  exec env - \
    PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
    PWD=/proc/self/cwd \
  /usr/bin/x86_64-w64-mingw32-gcc -MD -MF bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.d '-frandom-seed=bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o' -iquote . -iquote bazel-out/k8-fastbuild/bin -iquote external/bazel_tools -iquote bazel-out/k8-fastbuild/bin/external/bazel_tools -c main/hello-world.cc -o bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o)
SUBCOMMAND: # //main:hello-world [action 'Linking main/hello-world', configuration: a79594d39f0782b210e102e89b8a67dda26e295f95805aa9c0140f6281fdd3f5, execution platform: @local_config_platform//:host]
(cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
  exec env - \
    PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
    PWD=/proc/self/cwd \
  /usr/bin/x86_64-w64-mingw32-gcc -o bazel-out/k8-fastbuild/bin/main/hello-world bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o -Wl,-S -lstdc++)
ERROR: /home/federica/examples/cpp_mingw_toolchain/stage1/main/BUILD:3:10: output 'main/hello-world' was not created
ERROR: /home/federica/examples/cpp_mingw_toolchain/stage1/main/BUILD:3:10: not all outputs were created or valid
Target //main:hello-world failed to build
INFO: Elapsed time: 9.390s, Critical Path: 0.58s
INFO: 2 processes: 2 linux-sandbox.
FAILED: Build did NOT complete successfully

如果我往里面看bazel-out/k8-fastbuild/bin/main/hello-world未创建可执行文件。 但是,如果我尝试在 bash 中运行 verbose_failures 指示的单个命令:

cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
  exec env - \
    PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
    PWD=/proc/self/cwd \
  /usr/bin/x86_64-w64-mingw32-gcc -o bazel-out/k8-fastbuild/bin/main/hello-world bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o -Wl,-S -lstdc++

可执行文件“Hello-world.exe”已成功创建。

关于出了什么问题有什么建议吗?

下面是我的工具链构建文件

package(default_visibility = ["//visibility:public"])

cc_toolchain_suite(
    name = "mingw_suite",
    toolchains = {
        "k8": ":k8_toolchain",
    },
)



filegroup(name = "empty")

cc_toolchain(
    name = "k8_toolchain",
    toolchain_identifier = "k8-toolchain",
    toolchain_config = ":k8_toolchain_config",
    all_files = ":empty",
    compiler_files = ":empty",
    dwp_files = ":empty",
    linker_files = ":empty",
    objcopy_files = ":empty",
    strip_files = ":empty",
    supports_param_files = 0,
)

load(":cc_toolchain_config.bzl", "cc_toolchain_config")
cc_toolchain_config(name = "k8_toolchain_config")

和 cc_toolchain_config.bzl:

load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
   # NEW
load(
    "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
    "feature",
    "flag_group",
    "flag_set",
    "tool_path",
)

all_link_actions = [ # NEW
    ACTION_NAMES.cpp_link_executable,
    ACTION_NAMES.cpp_link_dynamic_library,
    ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]


def _impl(ctx):
    tool_paths = [ # NEW
        tool_path(
            name = "gcc",
            path = "/usr/bin/x86_64-w64-mingw32-gcc",
        ),
        tool_path(
            name = "ld",
            path = "/usr/bin/x86_64-w64-mingw32-ld",
        ),
        tool_path(
            name = "ar",
            path = "/usr/bin/x86_64-w64-mingw32-ld",
        ),
        tool_path(
            name = "cpp",
            path = "/bin/false",
        ),
        tool_path(
            name = "gcov",
            path = "/bin/false",
        ),
        tool_path(
            name = "nm",
            path = "/bin/false",
        ),
        tool_path(
            name = "objdump",
            path = "/bin/false",
        ),
        tool_path(
            name = "strip",
            path = "/bin/false",
        ),
    ]
    
    
    
    features = [ # NEW
        feature(
            name = "default_linker_flags",
            enabled = True,
            flag_sets = [
                flag_set(
                    actions = all_link_actions,
                    flag_groups = ([
                        flag_group(
                            flags = [
                                "-lstdc++",
                            ],
                        ),
                    ]),
                ),
            ],
        ),
    ]
    return cc_common.create_cc_toolchain_config_info(
        ctx = ctx,
        features = features, # NEW
        cxx_builtin_include_directories = [ # NEW
        "/usr/x86_64-w64-mingw32/include",
        "/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/c++",
        "/usr/share/mingw-w64/include",
        "/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include",
        "/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include-fixed",
        "/usr/include",
        ],        
        toolchain_identifier = "k8-toolchain",
        host_system_name = "local",
        target_system_name = "local",
        target_cpu = "k8",
        target_libc = "unknown",
        compiler = "i686-w64-mingw32-gcc",
        abi_version = "unknown",
        abi_libc_version = "unknown",
        tool_paths = tool_paths,
    )

cc_toolchain_config = rule(
    implementation = _impl,
    attrs = {},
    provides = [CcToolchainConfigInfo],
)


非常感谢您的帮助!


这个问题相对容易被忽略,但实际上已经包含在你的问题中,错误说hello-world尚未创建,同时hello-world.exe显然制作得很好。也就是说,我们实际上已经构建了一个文件.exe后缀,但没有告诉bazel通过它的工具链配置就是这种情况,如果没有它,它就无法期待输出。

为了解决这个问题,您还可以加载:artifact_name_pattern from @bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl与其他符号,然后设置artifact_name_patterns的属性cc_common.create_cc_toolchain_config_info():

artifact_name_patterns = [
    artifact_name_pattern(
        category_name = "executable",
        prefix = "",
        extension = ".exe",
    ),
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bazel 的 Mingw-w64 工具链 (Ubuntu 20.04.1 ) 的相关文章

随机推荐

  • “阻塞系统调用”是什么意思?

    阻塞系统调用 是什么意思 在我的操作系统课程中 我们正在学习多线程编程 当我在教科书中读到 当一个线程进行阻塞系统调用时 它可以允许另一个线程运行 时 我不确定这是什么意思 阻塞系统调用是必须等待操作完成的调用 read 将是一个很好的例子
  • 在 Java 中处理多个构造函数的最佳方法

    我一直想知道在 Java 中处理多个构造函数的最佳 即最干净 最安全 最有效 方法是什么 特别是当在一个或多个构造函数中未指定所有字段时 public class Book private String title private Stri
  • 弱链接的实际应用有哪些?

    使用特殊的编译器命令可以声明符号weak 根据维基百科 https en wikipedia org wiki Weak symbol 弱符号是目标文件或动态库中的符号定义 可能会被其他符号定义覆盖 什么场景或者什么应用需要弱符号 什么是典
  • 是否可以在 SASS mixin 中测试当前元素类型?

    我有一个 mixin 可以绘制这样的按钮 mixin button border 1px solid orange background orange padding 0 height 27px text transform upperca
  • Angular 2:让组件自动检测服务中的变量变化

    我目前面临的问题是 从功能上讲 当用户登录时 我的导航栏不会自动更新以向他们显示正确的链接 仅当我手动刷新不需要的页面时 它才会更新 因为这是单页面应用程序 我可以正常处理注销 因为注销按钮和功能位于控制导航栏的组件内 但是 登录是通过身份
  • C++ 中 _tmain() 和 main() 有什么区别?

    如果我使用以下 main 方法运行我的 C 应用程序 则一切正常 int main int argc char argv cout lt lt There are lt lt argc lt lt arguments lt lt endl
  • 分而治之——为什么它有效?

    我知道像归并排序和快速排序这样的算法使用分而治之的范式 但我想知道为什么它可以降低时间复杂度 为什么 分而治之 算法通常比非分而治之算法效果更好 分而治之的算法工作得更快 因为它们最终完成的工作更少 考虑二分搜索的经典分而治之算法 而不是看
  • 不需要播种 java.security.SecureRandom 吗?

    我使用的是 Java 1 7 如下面的代码所示 在 Ubuntu 中使用 Oracle 的 Java 7 编译器编译 java security SecureRandom似乎是不必要的 因为代码为两个伪随机序列的起始值生成两个不同的 Big
  • 我可以使用 Spring Data JPA 为 MappedSuperClass 的所有子级使用通用存储库吗?

    给定以下类结构 MappedSuperclass Inheritance strategy InheritanceType TABLE PER CLASS public abstract class Animal Entity public
  • Python 中正整数所需的最小位长度

    1 0b1 gt 1 5 0b101 gt 3 10 0b1010 gt 4 100 0b1100100 gt 7 1000 0b1111101000 gt 10 如何获取整数的位长度 即在 Python 中表示正整数所需的位数 在 pyt
  • 如何在python中转储不带引号的json

    这是我转储文件的方法 with open es hosts json w as fp json dump join host list keys fp 结果是 a b c 我想 a b c Thanks 在进行字符串替换之前 您可能需要st
  • 将 Pentaho Reporting Web 前端与自定义 Java/JSF 应用程序集成

    我有以下情况 带有数据的 OTLP 数据库架构 数据库过程将数据泵送到具有定义的维度和事实表的非规范化星型模式中 目标是构建 Web 应用程序 它可以对那些定义的数据结构进行汇总和深入分析 我可以构建自定义 Web 界面 但我更喜欢使用现有
  • 逻辑应用程序读取存储在变量中的json属性

    我在逻辑应用程序变量中有这个 json 我想要这个 JSON 的 id 属性并进一步使用 如何获取这个id属性值 我的 JSON 是 id 1 name John bright username Lily email email prote
  • 如何在ajax响应返回的脚本标签内执行javascript

    我正在发送一个 jquery get 请求 如下所示 get this attr href this serialize null script 我期望收到的响应将包含在脚本标签中 我知道浏览器不会执行响应 除非它返回时没有脚本标记 通常我
  • 元素 中“Project”属性的值“”无效。 vs2012

    我在尝试在 Visual Studio 2012 中加载某些项目时收到以下错误 G path project csproj error The value of the Project attribute in element
  • 如何在 VS Code 上设置 AngularDart5

    我已经广泛搜索了有关如何在 Visual Studio Code 上有效设置 Angular Dart 5 的文档 但到目前为止没有发现任何结论 我已经搜索过的地方 Youtube 堆栈溢出 https webdev dartlang or
  • Maven 与查询 DSL 集成

    我正在尝试将 Maven 中的现有项目与查询 dsl 集成 我添加了如下依赖项
  • .Net Core 中的 PagedList.Core.Mvc PagedListPager Html 扩展不存在

    似乎是PagedList Core不包含 Html helper 的扩展方法 所以我无法使用下面的代码 Html PagedListPager Model page gt Url Action Index new page PagedLis
  • 加载实体时的 nhibernate 竞争条件

    我的网络应用程序中存在休眠竞争条件问题 我知道在使用旧版本的 log4net 时会发生这种情况 应该在 1 2 10 中修复 尽管我也经历过这种情况 因此 我们暂时禁用了 log4net 因为竞争条件会导致 IIS 崩溃 并且在生产中发生这
  • Bazel 的 Mingw-w64 工具链 (Ubuntu 20.04.1 )

    我正在尝试使用 Bazel 在 Ubuntu 上为 mingw w64 创建工具链 我正在关注这个教程 https docs bazel build versions master tutorial cc toolchain config