C++ 标准库如何链接到我的应用程序?

Posted

技术标签:

【中文标题】C++ 标准库如何链接到我的应用程序?【英文标题】:How is the C++ standard library linked to my application? 【发布时间】:2009-08-22 19:02:19 【问题描述】:

当我通常使用来自第 3 方(非标准)C++ 库的代码(包括头文件)时,预构建的二进制文件会链接到(或包含在)代表我的应用程序的目标可执行文件,但 C++ 会发生什么标准库?,据我所见,我不必将库与仅使用 C++ 标准库中代码的应用程序一起发布,因此代码是静态链接并包含在可执行文件中的吗?

【问题讨论】:

【参考方案1】:

不,标准库默认是在运行时动态链接的。

运行动态加载器时,如果发现动态库加载并运行,它将在几个标准位置查找动态库,否则应用程序退出。

在 Unix 系统上: /usr/lib: 寻找:libstdc++*

在 Windows 上: c:\windows\system32 查找:MSVCRT.DLL

还有几个环境变量会影响搜索路径。查看 dlopen 的平台手册页以了解它们是什么。您需要的一切都应该在您平台上的 dlopen 手册页中。

大多数系统在适当的位置都有这些库,并且会自动找到。 STL 的其余部分不会引入额外的共享库依赖项。

【讨论】:

目录是c:\windows\system32。至少那是保存 Visual Studio 运行时的地方。我不认为 MinGW 链接到它们。 此外,mingw 将您的应用静态链接到其标准 C++ 库。 这个答案并不完全正确。 libstdc++ 与 MSVCRT.DLL 不同。后者是c库,前者是c++库。确实,MinGW 生成的每个二进制文件都将依赖于 MSVCRT.dll,但这与所提出的问题没有任何关系。正如我在下面指出的那样,正如 nos 在前面的评论中指出的那样,libstdc++ 库默认静态链接到您的可执行文件中。 此外,MSVCRT.DLL 是 Visual Studio 6 (VC98) C 运行时。较新版本的名称中有版本号,例如MSVCRT90.DLL,它们安装在“SxS”文件夹中。 @rustyx:当然。你是对的。仅仅晚了 3 年,上面已经提到过好几次了。【参考方案2】:

在最近的 MinGW gcc/g++ 版本 (4.40) 中,您可以使用标志 -shared-libstdc++ 链接到共享 dll 而不是默认静态库。

库的静态版本位于 /mingw/lib/gcc/mingw32/[gcc 版本]。文件名为 libstdc++.a。使用 MinGW 编译 c++ 应用程序时,默认情况下会链接。

【讨论】:

MinGW 的默认值似乎已更改,至少在我的系统上它默认链接到 libstdc++-6.dll。可以使用标志 -static-libstdc++ 禁用它。 @rustyx 很高兴知道。随意编辑我的答案以反映这一点(并给答案一个赞成票,以便它浮到顶部;) @rustyx 我尝试了 -static-libstdc++(和 -static-libgcc),但我的程序仍然动态链接到 mingw libstd*.dll 库。我正在交叉编译,知道为什么吗? @RustyX:你的回答解决了我的链接问题。谢谢!【参考方案3】:

MinGW C++ 程序唯一的基本运行时依赖 在 MSVCRT.DLL 上。其他依赖项将取决于您的程序实际执行的操作 - 例如,如果它使用 ODBC 数据库连接,它将 依赖于 ODBC32.DLL(可能还有其他一些 Windows DLL)。但是,在 MinGW C++ 程序中使用 std::string 或 std::vector 等类不会引入新的动态库依赖项。

如果您担心动态库依赖性,请查看 http://www.dependencywalker.com/的工具“Dependency Walker”

【讨论】:

【参考方案4】:

大部分都在头文件中,因为它的模板化程度很高。很少需要libstdc++.so(我认为可能是iostream)。

【讨论】:

STL 主要是头文件。标准库包括其他内容。 所有 C++ 都需要 libstdc++。它具有标准要求的一些基本功能。【参考方案5】:

C 和 C++ 运行时库的链接方式与普通库相同,主要区别在于它们通常由编译器和链接器自动编译和链接,无需指定它们。

但是,概括地说您不必将它们与您的应用一起提供是不正确的。在大多数情况下,您需要包含动态链接的二进制文件,例如,如果您使用 MSVC++ 编译,您将链接到构建机器上安装的任何内容,如果您在全新的 Windows 安装上安装动态链接的二进制文件,您除非您确保将库作为安装包的一部分包含在内,否则可能会遇到问题(请参阅有关 Visual Studio Redistributables 的文档)。在 Solaris 机器上也是如此(标准库作为补丁集的一部分进行升级)。在 Linux 中,它更复杂,由于 GPL,您无法静态链接,但是这些库通常通过发行版包安装。

【讨论】:

很好的答案,但是我说的是 mingw,它恰好静态链接标准库......

以上是关于C++ 标准库如何链接到我的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Linux C++ 将 Boost 编译到我的程序中

如何加载android系统本机库

如何将本机 C++ 静态库链接到托管 C++ 程序集

使用 C++ 的 SOIL 库链接器错误问题

如何将 Visual C 运行时静态链接到我的程序中? [复制]

标准库 stdio.h 重载函数的第二个 C 链接