C ++标准库如何链接到我的应用程序?(How is the C++ standard librar

2019-08-02 04:48发布

当我通常使用的代码(包括标题)由第三方(非标)C ++库,预建的二进制文件链接到(或包括在其中)代表我的应用程序的目标可执行文件,但与C ++标准库,会发生什么? ,据我看到我没有出货与使用代码只从C ++标准库的应用程序库,从而在码静态链接并包含在可执行文件?

Answer 1:

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

当运行动态加载器会在几个标准的地方动态库,如果它发现它加载并运行,否则应用程序退出。

在UNIX系统上:
/ usr / lib目录:寻找:++的libstdc *

在Windows上:
C:\ Windows \ System32下查找:MSVCRT.DLL

还有一对夫妇的环境变量可以影响搜索路径。 看看你的平台手册页的dlopen,看看它们是什么。 你需要的一切应该是在手册页你的平台上的dlopen。

大多数系统在适当的地方,这些库,并且将自动被发现。
STL中的其余部分将不会引入额外的共享库的依赖关系。



Answer 2:

在最近的MinGW GCC / G ++版本(4.40),你可以通过使用标志-shared-的libstdc ++对共享DLL而不是默认的静态链接库。

该库的静态版本都位于/ MinGW的/ lib目录/ GCC / mingw32的/ [gcc版本。 文件名是的libstdc ++。一。 这将默认编译使用MinGW一个C ++应用程序时,被链接英寸



Answer 3:

对于MinGW的C ++程序的唯一基本运行时扶养是MSVCRT.DLL。 其他的依赖关系将取决于你的程序实际上不会 - 例如,如果它使用ODBC数据库的连接,这将取决于ODBC32.DLL(也可能是一些其他的Windows DLL)。 然而,使用在MinGW的C ++程序类等的std :: string或std ::矢量不会引入新的动态库的依赖关系。

如果你担心动态库的依赖关系,在检查出的工具“的Dependency Walker” http://www.dependencywalker.com/



Answer 4:

大多数的这一切都在头文件,因为它是如此沉重模板。 很少需要libstdc++.soiostream ,可能是吧,我想)。



Answer 5:

C和C ++运行时库以同样的方式为正常库链接,主要的区别是,他们通常会被自动编译反对,编译器和连接器,而无需指定它们联系在一起。

这是不正确但是,概括你没有与您的应用程序把它们运。 在你船动态链接的二进制文件,你需要将它们包括,例如,如果你用MSVC ++编译,无论是安装在您的生成计算机上,你都会连接,如果你在一个全新的Windows安装的动态链接的二进制安装,则大多数情况下,可能会遇到问题,除非你确保库包含作为installpack(见有关Visual Studio再分发文件)的一部分。 同样是在Solaris机器上为真(标准库被升级为补丁集的一部分)。 对于Linux,它更复杂,你不能静态链接由于GPL的,但库通过发行包通常安装。



文章来源: How is the C++ standard library linked to my application?
标签: c++ mingw