【发布时间】:2014-07-17 15:54:55
【问题描述】:
我正在开发一个需要与 Windows XP 兼容的应用程序(是的...我知道...),我的同事争辩说他们不想使用 std::string,因为它 可能加载一些dlls,可能改变代码行为。
我不确定他们在这里是对还是错。在某些时候,必须有一些可以加载应用程序的共同点。
因此考虑到应用程序必须尽可能自包含的上下文,是否需要此应用程序加载 dll 才能使用 stl 或 string 或来自标准图书馆?
另外,假设我使用-static-libstdc++ 标志,可执行文件会大哪个数量级?
【问题讨论】:
-
没有。只有当您不使用静态链接时,您的同事才是正确的。这将发生在所有 stl 容器和函数上。
std::vector、std::string等。它必须加载libgcc_s_sjlj-1和libstdc++-6。但是,如果您使用-static、-static-libgcc、-static-libstdc++进行编译,则不需要加载任何内容。代码将静态链接到您的可执行文件并完全包含在内。可执行文件会更大。以上是针对 gcc/g++/mingw 的。如果使用 MSVC,那么它会加载msvcrtXX.dll,其中 XX 是版本号。不确定msvcrt是否与stl有关.. -
@Brandon 大的数量级是多少?
-
更大。我不能给出确切的数字,因为每个人都不一样。实际上,您将使用上述标志静态编译所有内容,而不仅仅是 stl 代码,还有 Windows 代码(
gdi、comctrl等)。出于这个原因,它会更大一些。我不确定有什么方法可以只静态链接 gcc。也许只将 gcc 库添加到链接器并删除静态标志could工作;但我不确定100%。
标签: c++ windows dll static-libraries