是否可以使用 gcc 构建一个自包含的库(即静态合并其依赖项的库)?

Posted

技术标签:

【中文标题】是否可以使用 gcc 构建一个自包含的库(即静态合并其依赖项的库)?【英文标题】:Is it possible to build a self-contained library with gcc (i.e., one which statically incorporates its dependencies)? 【发布时间】:2011-02-28 13:40:18 【问题描述】:

我正在尝试使用 gcc(实际上是 MinGW)构建一个依赖于 stdlibc++ 的库。我想构建 mylib,使其所有依赖项都包含在其中,这样任何与 mylib 链接的人都不需要链接到 stdlibc++(或者,如果他们这样做,那是因为他们自己的代码依赖于 stdlibc++)。这个可以吗?

【问题讨论】:

您确定要这样做吗,这是唯一的解决方案吗?发布本地标准库的静态编译版本是个坏主意。 您是否验证过您可以使用 GCC 构建一个库,并拥有与使用 Borland 编译器编译的代码的链接?据我所知,不能保证 C 编译器共享相同的库格式……除非这是一个 DLL 和/或动态/共享库。 您列出了 C 和 C++。您使用哪种语言?你知道你的用户正在使用哪个版本的 Borland 编译器吗?它是否与 msvcrt 相关联?有很多事情可能会使这不起作用。 @Tenfour,该问题已在问题的先前版本中进行了描述:Uckelman 库的预期使用者是一个明显不使用 libstdc++.a 的 Borland 链接器(自从 Borland 以来,这真的不足为奇提供自己的标准库实现)。 Uckelman 想通过将库的必要部分合并到他自己的库中来消除他的库对 libstdc++ 的依赖。 @Santiago:“发布本地标准库的静态编译版本是个坏主意。”我相信恰恰相反。你有这个说法的理由吗?它将消除由于 dll 的错误版本/缺失/配置问题而导致现场故障的可能性。它运行速度更快,可执行文件更小。 【参考方案1】:

使用ar -x 从原始库(libstdc++,在您的情况下)中提取您需要的 .o 文件。链接库时,将这些 .o 文件包含在您自己的文件中。确保原始库的分发条款与您自己的兼容。

【讨论】:

在命令行中包含库本身是否就足够了? AFAIK,编译器足够聪明,可以自己从*.a 文件中提取目标文件。

以上是关于是否可以使用 gcc 构建一个自包含的库(即静态合并其依赖项的库)?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使静态 C++ 库自包含?

使用 gcc 和 msvc 工具集生成的库

在构建我的 C++ 可执行文件 (gcc) 时,我可以获得所有链接库的报告吗? (包括静态链接)

我可以让 gcc 链接器创建一个静态库吗?

使用自定义构建的 gcc(g++) 构建 c++ 项目

未定义弱函数的引用(静态库+ GCC)