代码之家  ›  专栏  ›  技术社区  ›  cjds

在Bazel中创建一个完全静态的C++二进制

  •  0
  • cjds  · 技术社区  · 3 年前

    是否有可能在Bazel中创建一个完全静态的二进制文件,或者GCC或Bazel中是否存在阻止我的错误。

    这就是我得到的错误

    /bin/ld.gold: error: /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginT.o: requires dynamic R_X86_64_32 reloc against '__TMC_END__' which may overflow at runtime; recompile with -fPIC
    

    如果我理解正确的话,这是一个没有静态链接的libstdc++版本。我想知道是否有一个静态链接的libstdc++版本可以让Bazel使用。

    试图在Bazel的回购协议中研究这个问题,但提到的解决方法对我来说不起作用

    https://github.com/bazelbuild/bazel/issues/8672

    信息转储

    • Bazel版本: 3.3.1
    • GCC版本:GCC(Ubuntu9.3.0-17ubuntu1~20.04)9.3.0
    • OS:Ubuntu20.04在Docker容器中

    我的构建文件

    cc_binary(
      name = "main",
      srcs = ["main.cpp"],
      linkshared=True,
      copts = ["-shared", "-fpic", "-fPIC"],
      features = ["fully_static_link"],
    )
    

    主要的cpp

    int main()
    {
      return 1;
    }
    
    

    具有类似结果的其他版本的生成文件

    cc_binary(
        name = "main",
        srcs = ["main.cpp"],
        linkshared=True,
        linkstatic=1,
        linkopts = ["-static"]
    )
    
    cc_binary(
        name = "main",
        srcs = ["main.cpp"],
        linkshared=True,
        linkstatic=1,
        linkopts = ["-static"],
        features = ["fully_static_link"],
        copts=["-fpic"],
    )
    

    TL;博士

    Bazel不会在Ubuntu20.04、GCC 9.3.0中编译完全静态的二进制文件。我想了解发布的问题是否相关,或者我是否不了解静态链接?

    0 回复  |  直到 3 年前