使用 clang 的静态 link libstdc++
Static link libstdc++ using clang
当我使用 GCC 时,我可以使用以下方法在我的 Ubuntu 15.04 上构建程序:
-static-libgcc -static-libstdc++
编译后的二进制文件可以 运行 "stock" Ubuntu 14.04,无需任何外部包,只有标准更新。
是否有可能通过 clang 使用此静态链接到库进行构建?
最常见的答案:
- 使用测试 ubuntu 代表 (
ppa:ubuntu-toolchain-r/test
)
- 更新服务器
- 在目标服务器上重新编译
- 不要使用 GCC
不适合我。
我可以在 Ubuntu 14.04.3 LTS 上使用 clang 为 运行 执行此操作吗?
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
文件无法保存有关静态或动态链接的信息,因此必须在链接阶段指定此标志(并且,为避免警告,仅在 链接阶段)。
不使用-static-libstdc++ 或-static-libgcc,而是使用clang 的-static 标志。它将生成一个非动态可执行文件,其中包含静态链接所需的所有内容。
在我的测试程序中,它产生:
[root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes
not a dynamic executable
当我使用 GCC 时,我可以使用以下方法在我的 Ubuntu 15.04 上构建程序:
-static-libgcc -static-libstdc++
编译后的二进制文件可以 运行 "stock" Ubuntu 14.04,无需任何外部包,只有标准更新。
是否有可能通过 clang 使用此静态链接到库进行构建?
最常见的答案:
- 使用测试 ubuntu 代表 (
ppa:ubuntu-toolchain-r/test
) - 更新服务器
- 在目标服务器上重新编译
- 不要使用 GCC
不适合我。
我可以在 Ubuntu 14.04.3 LTS 上使用 clang 为 运行 执行此操作吗?
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
文件无法保存有关静态或动态链接的信息,因此必须在链接阶段指定此标志(并且,为避免警告,仅在 链接阶段)。
不使用-static-libstdc++ 或-static-libgcc,而是使用clang 的-static 标志。它将生成一个非动态可执行文件,其中包含静态链接所需的所有内容。
在我的测试程序中,它产生:
[root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes
not a dynamic executable