【问题标题】:Is my application loading a dll to use std::string?我的应用程序是否正在加载 dll 以使用 std::string?
【发布时间】:2014-07-17 15:54:55
【问题描述】:

我正在开发一个需要与 Windows XP 兼容的应用程序(是的...我知道...),我的同事争辩说他们不想使用 std::string,因为它 可能加载一些dlls可能改变代码行为。

我不确定他们在这里是对还是错。在某些时候,必须有一些可以加载应用程序的共同点。

因此考虑到应用程序必须尽可能自包含的上下文,是否需要此应用程序加载 dll 才能使用 stlstring 或来自标准图书馆?

另外,假设我使用-static-libstdc++ 标志,可执行文件会大哪个数量级?

【问题讨论】:

  • 没有。只有当您不使用静态链接时,您的同事才是正确的。这将发生在所有 stl 容器和函数上。 std::vectorstd::string 等。它必须加载 libgcc_s_sjlj-1libstdc++-6。但是,如果您使用-static-static-libgcc-static-libstdc++ 进行编译,则不需要加载任何内容。代码将静态链接到您的可执行文件并完全包含在内。可执行文件会更大。以上是针对 gcc/g++/mingw 的。如果使用 MSVC,那么它会加载 msvcrtXX.dll,其中 XX 是版本号。不确定msvcrt是否与stl有关..
  • @Brandon 大的数量级是多少?
  • 更大。我不能给出确切的数字,因为每个人都不一样。实际上,您将使用上述标志静态编译所有内容,而不仅仅是 stl 代码,还有 Windows 代码(gdicomctrl 等)。出于这个原因,它会更大一些。我不确定有什么方法可以只静态链接 gcc。也许只将 gcc 库添加到链接器并删除静态标志 could 工作;但我不确定100%

标签: c++ windows dll static-libraries


【解决方案1】:

在 Windows 中,使用 CRT 库支持 STL。这些库需要在运行应用程序之前部署运行时 DLL。使用不同版本的 Visual Studio 编译代码将创建对特定 CRT 版本的依赖。使用 vs2013 编译代码将需要与 vs2010 大不相同的 CRT 版本。因此,您不能将 STL 对象从一个 CRT 版本使用/传递到另一个使用不同版本的 dll。在使用 CRT 库之前,请阅读 microsoft 文章。以下文章适用于 vs2013: http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx 我建议您使用 ATL:CString,它更容易实现,并且静态版本库也比 CRT 库紧凑得多。

【讨论】:

  • 假设我总是针对 XP CRT(MSVC 中的平台工具集,如果我是对的)构建应用程序,那么我应该担心 XP 和 Windows 7/8 之间的兼容性吗?
  • 如果所有组件都使用相同的 CRT,那么您可以使用它。它应该适用于所有操作系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多