当我通常使用来自第三方(非标准)C ++库的代码(包括头文件)时,预构建的二进制文件链接到(或包含在)代表我的应用程序的目标可执行文件中,但是C ++会发生什么标准库?,据我所知,我不必运送一个只使用C ++标准库代码的应用程序库,因此代码是静态链接并包含在可执行文件中的吗?
答案 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++.so
(iostream
,我认为可能是它。
答案 4 :(得分:1)
C和C ++运行时库的链接方式与普通库相同,主要区别在于它们通常由编译器和链接器自动编译并链接,无需指定它们。
然而,这是不正确的,概括说您不必随应用程序一起发货。在大多数情况下,您需要包含动态链接二进制文件,例如,如果使用MSVC ++进行编译,则会链接到构建计算机上安装的任何内容,如果在新安装的Windows上安装动态链接二进制文件,则除非您确保将库作为installpack的一部分包含在内,否则可能会遇到问题(请参阅有关visual studio redistributables的文档)。在Solaris计算机上也是如此(标准库作为补丁集的一部分进行升级)。使用Linux,它更复杂,由于GPL而无法静态链接,但是库通常是通过发行版软件包安装的。