使用clang进行静态链接libstdc++

17

当我使用GCC时,我可以在我的Ubuntu 15.04上使用以下命令来构建程序:

-static-libgcc -static-libstdc++

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

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

最常见的答案:

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

这对我来说不合适。

只需要使用clang就可以在Ubuntu 14.04.3 LTS上运行它吗?


这个行不行?-static -lstdc++ - Ashkan
2
@vladon 在使用clang++ 3.6时,选项-static-libgcc -static-libstdc++可以正常工作。 - Danh
@Danh 简单的“Hello World”程序可以编译通过,但对于大型程序,则会出现警告:“clang: warning: argument unused during compilation: '-static-libgcc'”和“clang: warning: argument unused during compilation: '-static-libstdc++'”。 - vladon
@keltar 嗯...如何运行clang链接器?我认为应该是clang++ -static-libgcc -static-stdc++ -std=c++14 test.cpp -o test - vladon
@vladon 是的,就像那样。我的意思是,如果你的程序有多个文件,在链接阶段应该只使用这些标志一次,而不是在每个文件的编译中都使用。 - keltar
显示剩余3条评论
2个回答

19

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

$ 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接