c++ - 使用 clang 的静态链接 libstdc++

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

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

-static-libgcc -static-libstdc++

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

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

最常见的答案:

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

不适合我。

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

最佳答案

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 文件无法保存有关静态或动态链接的信息,因此必须在链接阶段指定此标志(并且,为避免警告,在链接阶段)。

关于c++ - 使用 clang 的静态链接 libstdc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34411995/

相关文章:

asp.net - 在 Ubuntu 中运行 ASP.NET 和 VB.Net

c - 无法在 vscode 中调试单个 .c 文件

clang:有没有办法指定 c11 原子操作中使用的低级指令?

hardware - 为 LLVM/CLANG 选择 CPU 架构

c++ - 为什么 std::sort 比手工编码的 "introsort"更快?

c++ - MS 构建错误 MSB8007 : The Platform for project 'MyProject.vcxproj' is invalid. 使用 MSBuild 针对自定义 SDK 构建 Visual Studio 项目

C++如何在不调用构造函数的情况下分配对象

c++ - Visual Studio 不能包含头文件。

ubuntu - GPL 鬼脚本 9.10 : ColorConversionStrategy is incompatible to ProcessColorModel

C++ Clang_format_style 在 VSCode 中的方法返回值数据类型之后强制 'newline'