【问题标题】:Static link libstdc++ using clang使用 clang 静态链接 libstdc++
【发布时间】:2015-12-22 09:04:04
【问题描述】:

当我使用 GCC 时,我可以使用这个在我的 Ubuntu 15.04 上构建程序:

-static-libgcc -static-libstdc++

编译后的二进制文件可以在“库存”Ubuntu 14.04 上运行,无需任何外部软件包,只有标准更新。

是否有可能使用 clang 使用此静态链接到库进行构建?

最常见的答案:

  • 使用测试 ubuntu 代表 (ppa:ubuntu-toolchain-r/test)
  • 更新服务器
  • 在目标服务器上重新编译
  • 不要使用 GCC

不适合我。

我可以在 Ubuntu 14.04.3 LTS 上使用 clang 执行此操作吗?

【问题讨论】:

  • 这不行吗? -static -lstdc++
  • @Ashkan 不,很遗憾。
  • @vladon Options -static-libgcc -static-libstdc++ 与 clang++ 3.6 配合得很好。
  • @Danh 像 hello world 这样的简单程序也可以为我编译,但对于大型程序有警告:clang: warning: argument unused during compilation: '-static-libgcc'clang: warning: argument unused during compilation: '-static-libstdc++'
  • @vladon 有链接标志,而不是编译,因此会出现警告。

标签: c++ ubuntu clang static-linking libstdc++


【解决方案1】:

clang 在这个问题上与 gcc 兼容。基本上对于使用 iostream 来确保 libstdc++ 要求的 hello-world 程序(实际的 lib 版本可能因发行版而异):

$ clang++ test.cpp
$ ldd ./a.out
        linux-vdso.so.1 (0x00007ffec65c0000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6 (0x00007ff937bb6000)
        libm.so.6 => /lib64/libm.so.6 (0x00007ff9378b6000)
        libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1 (0x00007ff93769e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ff9372fe000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff937f3e000)

这是libstdc++libgcc_s 的依赖项。但是如果你加-static-libgcc -static-libstdc++:

$ clang++ test.cpp -static-libgcc -static-libstdc++
$ ldd ./a.out
        linux-vdso.so.1 (0x00007ffe5d678000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fb8e4516000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb8e4176000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb8e4816000)

这仍然依赖于libc,但这是一个不同的问题。

clang: warning: argument unused during compilation: '-static-libstdc++' 表示 clang 忽略了这个标志,因为标志在当前情况下是无用的。首先想到的两个示例是编译 C 代码(显然不依赖于 libstdc++),或者发出不带链接的仅编译命令(-c 标志)。由于.o 文件无法保存有关静态或动态链接的信息,因此必须在链接阶段指定此标志(为了避免警告,在链接阶段)。

【讨论】:

    【解决方案2】:

    不要使用 -static-libstdc++ 或 -static-libgcc,只需使用 clang 的 -static 标志。它将生成一个非动态的可执行文件,其中需要静态链接的所有内容。

    在我的测试程序中,它产生:

    [root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes  
    not a dynamic executable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2017-11-30
      相关资源
      最近更新 更多