使用clang的静态链接libstdc++
Static link libstdc++ using clang
当我使用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
相关文章:
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- 当其他链接库链接 stdc++ 为动态时,如何将 libstdc++ 链接设置为静态?
- 如何使用LLVM LLD链接libstdc++
- I686-ELF的跨编译和链接libstdc (在Ubuntu上使用G 16.04)
- 如何使用libc libstdc 混合的链接库
- 将libstdc 静态链接起来是一个很好的做法
- 'libstdc++'库的链接在嵌入式 Linux 中被破坏
- Eclipse CDT链接选项-静态libgcc-静态libstdc++不影响Windows上的行为
- 获取指向成员std::string::size的指针无法与libc++链接,但可以与libstdc++一起使用
- 我有libstdc++6-dev,但仍然有stl链接错误
- CodeBlocks:如何动态链接libstdc++
- 使用clang的静态链接libstdc++
- 与使用 GCC 3.4.6 (libstdc++.so.6.0.13) 生成的 gmock 库链接会产生"undefined reference to... @GLIBCXX_3.4.9"错误
- 在动态链接库libstdc++-6.dll中找不到过程入口点_gxx_personality_v0.错误
- 如何链接GCC中的libc和libstdc++的调试版本
- 从源代码构建GCC 5.4;这样构建的可执行文件试图链接不兼容的libstdc++,但运行失败
- CentOS 5.8与gcc 4.4.7链接libstdc++ 6.0.8.这怎么可能
- 在动态链接库libstdc++-6.dll中无法找到过程入口点_gxx_personality_v0
- 如何静态链接libstdc++
- 在 RHEL 5.7 上链接 libstdc++ 问题