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

Law*_*and 5 c++ mingw

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

Mar*_*ork 11

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

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

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

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

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

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

  • 这个答案并不完全正确.libstdc ++与MSVCRT.DLL不同.后者是*c*库,前者是*c ++*库.确实,MinGW生成的每个二进制文件都依赖于MSVCRT.dll,但这与提出的问题没有任何关系.正如我在下面指出的那样,正如nos在前面的注释中指出的那样,libstdc ++库默认情况下静态链接到您的可执行文件中. (4认同)
  • 除此之外,mingw将您的应用程序静态链接到其标准C++库. (3认同)
  • 目录是`c:\ windows\system32`.至少那是Visual Studio的运行时保存的地方.我不认为MinGW会与他们联系. (2认同)

Mat*_*ert 7

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

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

  • MinGW的默认值似乎已被更改,至少在我的系统上它默认链接libstdc ++ - 6.dll.可以使用标志`-static-libstdc ++`禁用它. (3认同)