【问题标题】:Why is /clr incompatible with /mt and /mtd in Visual Studio?为什么 /clr 与 Visual Studio 中的 /mt 和 /mtd 不兼容?
【发布时间】:2010-10-30 15:02:37
【问题描述】:

谁能为我解释一下 /clr 如何以及为什么与 /mtd 不兼容? 有什么替代方案?如果我使用 /md 或 /mdd 内部会发生什么?

据我所知,我们不会同时使用 /clr 和 /mtd。有人可以解释是否有办法做到这一点?请解释一下 /clr 如何以及为什么与 Visual Studio 中的 /mt 和 /mtd 不兼容?

【问题讨论】:

  • 为什么要同时使用 /clr 和 /mtd?如果您告诉我们您的目标是什么,我们或许可以帮助您做到这一点。
  • .. 可能他只是好奇:)

标签: visual-studio visual-c++ visual-studio-2005 c++-cli conditional-compilation


【解决方案1】:

我希望得到线索here:

如果您使用的是 /clr 编译器 开关,您的代码将与 导入库 msvcmrt.lib。这 导入库引用一个新的 库 msvcm80.dll,它提供了一个 您的托管代码和 原生 CRT。您不能使用 静态链接 CRT ( /MT 或 /MTd 选项)与 /clr。使用 动态链接库(/MD 或 /MDd) 代替。

/clr 标志使您的代码引用一个新的 dll msvcm80.dll - 它充当您的托管代码和 CRT 之间的代理。很难准确地说出这个代理做了什么,但我猜它充当了托管堆上分配、垃圾收集、托管线程等的接口。如果您链接 CRT 的静态版本,则代理将无法拦截您对运行时库的调用。

【讨论】:

  • 很好的答案,我可以以某种方式使用带有 /mt 标志的 C++/CLI 吗?
  • @Gilad 你为什么想要它?您要链接的库是线程安全的,一旦您请求 CLR 存在,就没有理由进行静态链接,因此我看不出有任何缺点。
  • 我认为能够与静态 CRT 库链接的主要原因是不必在目标机器上安装可再发行组件。
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2021-12-31
  • 2022-07-11
  • 2015-07-30
  • 2017-10-11
相关资源
最近更新 更多