7

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

4

5 回答 5

12

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

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

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

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

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

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

于 2009-08-22T19:08:18.677 回答
7

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

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

于 2009-08-22T21:59:20.393 回答
3

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

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

于 2009-08-22T19:20:01.417 回答
2

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

于 2009-08-22T19:07:25.573 回答
1

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

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

于 2009-09-30T23:39:55.767 回答