静态链接libstdc ++使用clang

当我使用GCC时,我可以用我的Ubuntu 15.04编译程序:

-static-libgcc -static-libstdc++ 

编译后的二进制文件可以在没有任何外部软件包的情况下运行在“库存”Ubuntu 14.04上,

有没有可能build立这个静态链接到图书馆与叮当

最常见的答案是:

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

不适合我。

我可以用clang来做这个,在Ubuntu 14.04.3 LTS上运行它吗?

铿锵在这个问题上与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文件不能保存有关静态或动态链接的信息,因此必须在链接阶段指定此标志(并且为了避免警告, 在链接阶段)。