【发布时间】:2009-08-22 19:02:19
【问题描述】:
当我通常使用来自第 3 方(非标准)C++ 库的代码(包括头文件)时,预构建的二进制文件会链接到(或包含在)代表我的应用程序的目标可执行文件,但 C++ 会发生什么标准库?,据我所见,我不必将库与仅使用 C++ 标准库中代码的应用程序一起发布,因此代码是静态链接并包含在可执行文件中的吗?
【问题讨论】:
当我通常使用来自第 3 方(非标准)C++ 库的代码(包括头文件)时,预构建的二进制文件会链接到(或包含在)代表我的应用程序的目标可执行文件,但 C++ 会发生什么标准库?,据我所见,我不必将库与仅使用 C++ 标准库中代码的应用程序一起发布,因此代码是静态链接并包含在可执行文件中的吗?
【问题讨论】:
不,标准库默认是在运行时动态链接的。
运行动态加载器时,如果发现动态库加载并运行,它将在几个标准位置查找动态库,否则应用程序退出。
在 Unix 系统上:
/usr/lib: 寻找:libstdc++*
在 Windows 上:
c:\windows\system32 查找:MSVCRT.DLL
还有几个环境变量会影响搜索路径。查看 dlopen 的平台手册页以了解它们是什么。您需要的一切都应该在您平台上的 dlopen 手册页中。
大多数系统在适当的位置都有这些库,并且会自动找到。
STL 的其余部分不会引入额外的共享库依赖项。
【讨论】:
c:\windows\system32。至少那是保存 Visual Studio 运行时的地方。我不认为 MinGW 链接到它们。
在最近的 MinGW gcc/g++ 版本 (4.40) 中,您可以使用标志 -shared-libstdc++ 链接到共享 dll 而不是默认静态库。
库的静态版本位于 /mingw/lib/gcc/mingw32/[gcc 版本]。文件名为 libstdc++.a。使用 MinGW 编译 c++ 应用程序时,默认情况下会链接。
【讨论】:
-static-libstdc++ 禁用它。
MinGW C++ 程序唯一的基本运行时依赖 在 MSVCRT.DLL 上。其他依赖项将取决于您的程序实际执行的操作 - 例如,如果它使用 ODBC 数据库连接,它将 依赖于 ODBC32.DLL(可能还有其他一些 Windows DLL)。但是,在 MinGW C++ 程序中使用 std::string 或 std::vector 等类不会引入新的动态库依赖项。
如果您担心动态库依赖性,请查看 http://www.dependencywalker.com/的工具“Dependency Walker”
【讨论】:
大部分都在头文件中,因为它的模板化程度很高。很少需要libstdc++.so(我认为可能是iostream)。
【讨论】:
C 和 C++ 运行时库的链接方式与普通库相同,主要区别在于它们通常由编译器和链接器自动编译和链接,无需指定它们。
但是,概括地说您不必将它们与您的应用一起提供是不正确的。在大多数情况下,您需要包含动态链接的二进制文件,例如,如果您使用 MSVC++ 编译,您将链接到构建机器上安装的任何内容,如果您在全新的 Windows 安装上安装动态链接的二进制文件,您除非您确保将库作为安装包的一部分包含在内,否则可能会遇到问题(请参阅有关 Visual Studio Redistributables 的文档)。在 Solaris 机器上也是如此(标准库作为补丁集的一部分进行升级)。在 Linux 中,它更复杂,由于 GPL,您无法静态链接,但是这些库通常通过发行版包安装。
【讨论】: