使用clang的静态链接libstdc++

Static link libstdc++ using clang

本文关键字:链接 libstdc++ 静态 clang 使用      更新时间:2023-10-16

当我使用GCC时,我可以在Ubuntu 15.04上使用以下代码构建程序:

-static-libgcc -static-libstdc++

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

是否有可能使用clang构建与库的静态链接?

最常见的答案:

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

不适合我。

我可以用clang在Ubuntu 14.04.3 LTS上运行它吗?

clang在这个问题上与gcc兼容。基本上适用于helloworld程序,该程序使用iostream来确保libstdc++需求(实际的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文件无法保存有关静态或动态链接的信息,因此必须在链接阶段指定此标志(为了避免警告,仅在链接阶段)。

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

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

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