-static-libstdc++ GCC标志会影响Linux上生成静态库(*.a)吗?

Does -static-libstdc++ GCC flag affect the generation of a static library (*.a) on Linux

本文关键字:静态 标志 GCC 影响 Linux -static-libstdc++      更新时间:2023-10-16

这个问题来自以下场景:

有一个静态c++库 a 和一个可执行库B,它链接到 a 。我希望B独立于c++运行时。

我知道在MSVC中,如果A是用/MD标志编译的,那么B肯定会依赖于MSVC *.dll。

但是我对-static-libstdc++是否在linux上对GCC起同样的作用感到困惑。

我的问题是linux上的GCC,当我编译A时,我是否需要使用-static-libstdc++,或者它只是一个链接器标志,根本不影响A

我相信答案是肯定的(但还没有尝试过)。

原因是代码访问动态库中的符号与静态符号(可执行文件中的符号)不同。在你的例子中,这是库A。

对于静态符号,当链接可执行文件时,这些符号被解析为内存地址。实际上,符号的名称根本不需要保存在可执行文件中(这被称为"剥离的"可执行文件)。

对于动态库中的符号,符号的名称必须出现,并且它们由可执行文件中的代码访问以加载符号(可能使用dlopendlsym等函数)