C++;链接到我的应用程序的标准库? 通常,当我从第三方(非标准)C++库中使用代码(包括头文件)时,一个预先生成的二进制文件链接到(或包含在)表示我的应用程序的目标可执行文件中,但是C++标准库会发生什么呢?就我所见,我不必用一个只从C++标准库使用代码的应用程序来向一个库发送代码,因此,代码是静态链接的,包含在可执行文件中?

C++;链接到我的应用程序的标准库? 通常,当我从第三方(非标准)C++库中使用代码(包括头文件)时,一个预先生成的二进制文件链接到(或包含在)表示我的应用程序的目标可执行文件中,但是C++标准库会发生什么呢?就我所见,我不必用一个只从C++标准库使用代码的应用程序来向一个库发送代码,因此,代码是静态链接的,包含在可执行文件中?,c++,mingw,C++,Mingw,大部分都在头文件中,因为它的模板太重了。几乎不需要libstdc++。因此(iostream,我想可能就是它)。不,默认情况下,标准库在运行时是动态链接的 当运行动态加载程序时,如果发现它加载并运行了动态库,它将在几个标准位置查找动态库,否则应用程序将退出 在Unix系统上: /usr/lib:查找:libstdc++* 在Windows上: c:\windows\system32查找:MSVCRT.DLL 还有几个环境变量会影响搜索路径。请查看dlopen的平台手册页,了解它们是什么。您需要的

大部分都在头文件中,因为它的模板太重了。几乎不需要libstdc++。因此(
iostream
,我想可能就是它)。

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

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

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

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

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

大多数系统将这些LIB放在适当的位置,并将自动找到。

STL的其余部分不会引入额外的共享LIB依赖关系。

是MIWW C++程序唯一的基本运行时依赖性。 位于MSVCRT.DLL上。其他依赖性将取决于您的程序实际执行的操作-例如,如果它使用ODBC数据库连接,它将 依赖于ODBC32.DLL(可能还有其他一些Windows DLL)。然而,使用类如:STM::String或STD::vector在明文C++程序中不会引入新的动态库依赖关系。 如果您担心动态库依赖性,请查看


在最新的MinGW gcc/g++版本(4.40)中,位于

的工具“Dependency Walker”可以通过使用标志shared libstdc++链接到共享dll,而不是默认的静态库


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

< P> C和C++运行库与正常库的链接方式相同,主要区别是它们通常被编译器和链接器自动编译和链接,而不需要指定它们。
然而,概括地说你不必将它们与你的应用程序一起发布是不正确的。在大多数情况下,如果您提供动态链接的二进制文件,您将需要包含它们,例如,如果您使用MSVC++编译,您将针对构建计算机上安装的任何内容进行链接,如果您在新的windows安装中安装动态链接的二进制文件,除非确保这些库作为installpack的一部分包含在内,否则很可能会遇到问题(请参阅有关visual studio可再发行文件的文档)。Solaris机器上也是如此(标准库作为修补程序集的一部分进行了升级)。对于Linux,它更复杂,由于GPL,您无法静态链接,但是库通常通过发行版软件包安装。

STL主要是头文件。标准库包括其他东西,所有C++都需要LIbSTDC++。其中有一些标准要求的基本功能。目录为
c:\windows\system32
。至少这是VisualStudio运行时保存的地方。我认为MinGW没有联系到他们。而且,要补充到,MIW静态地把你的应用程序链接到它的标准C++库。这个答案并不完全正确。libstdc++与MSVCRT.DLL不同。后者是C库,前者是C++库。的确,MinGW生成的每个二进制文件都依赖于MSVCRT.dll,但这与所问的问题没有任何关系。正如我在下面指出的,正如nos在前面的评论中指出的,libstdc++库默认静态链接到可执行文件中。此外,MSVCRT.DLL是Visual Studio 6(VC98)C运行时。较新版本的名称中有版本号,例如MSVCRT90.DLL,它们安装在“SxS”文件夹中。@rustyx:当然。你说得对。刚刚晚了三年,上面已经提到过好几次了。回答不错,不过我说的是mingw,它碰巧静态链接标准库……mingw的默认设置似乎已经更改,至少在我的系统上,它默认链接到libstdc++-6.dll。可以使用一个标志
-static libstdc++
@rustyx禁用它,这很好。请随意编辑我的答案以反映这一点(并给答案一个向上投票,使其浮到顶部;@rustyx我尝试了-static libstdc++(和-static libgcc),但我的程序仍然动态链接到mingw libstd*.dll库。我在交叉编译,知道为什么吗?@RustyX:你的回答解决了我的链接问题。谢谢