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

时间:2009-08-22 19:02:20

标签: c++ mingw

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

5 个答案:

答案 0 :(得分:11)

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

当运行动态加载程序时,如果发现它已加载并运行,则会查看动态库的几个标准位置,否则应用程序退出。

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

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

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

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

答案 1 :(得分:7)

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

该库的静态版本位于/ mingw / lib / gcc / mingw32 / [gcc version]中。文件名是libstdc ++。在使用MinGW编译c ++应用程序时,默认情况下将链接此链接。

答案 2 :(得分:3)

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

如果您担心动态库依赖,请查看  http://www.dependencywalker.com/

上的“Dependency Walker”工具

答案 3 :(得分:1)

大部分都在头文件中,因为它是如此模糊。很少需要libstdc++.soiostream,我认为可能是它。

答案 4 :(得分:1)

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

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