【问题标题】:Why do i need to specify runtime library type for static lib building?为什么我需要为静态库构建指定运行时库类型?
【发布时间】:2014-12-03 16:16:45
【问题描述】:

当我构建我的静态库时,它是否链接到运行时库?它是否将运行时库中的代码“放入”我的库中?

或者它只是链接器的信息,因此当它链接最终的 exe(dll) 时,它知道要为这个特定的静态库使用哪个版本的运行时库?

我是否需要在所有静态库和 dll 中使用相同版本的运行时库? 我需要在所有静态库和 dll 中使用相同的类型(/MT /MTd /MDd ...)吗?

还有一个简短的问题,静态 windows 库的大小通常是 linux 静态库的两倍吗?

【问题讨论】:

  • 快速测试。将运行时库更改为现在设置的其他内容。按“构建”(不要执行“全部重建”)。请注意,整个库是从头开始重建的,编译所有模块。鉴于您的所有问题,这表明了什么?

标签: c++ windows visual-c++ linker


【解决方案1】:

或者它只是链接器的信息,所以当它链接最终 exe(dll) 它知道为此使用什么版本的运行时库 特定的静态库?

是的。

我是否需要在所有静态文件中使用相同版本的运行时库 库和dll?

我强烈建议这样做。如果你不这样做,你会得到一堆链接器错误。

我是否需要在所有静态文件中使用相同的类型 (/MT /MTd /MDd ...) 库和dll?

是的。

如果您要发布供第 3 方使用的 DLL,您可能希望向他们提供使用 /MTd 标志的 YourLibraryD.dll 和使用 /MT 的 YourLibrary.dll。每个都有不同的解决方案配置。没有人再使用单线程版本了,因为性能损失现在几乎无关紧要,不值得冒险。

编辑:即使您不向第 3 方发布,您仍然需要确保在调试 -vs- 发布模式下链接到正确的 DLL。这是因为当您在使用 /MTd 的 Debug 中构建 YourApp.exe 时,您会希望它链接到 YourLibraryD.dll。当您在使用 /MT 的 Release 中构建 YourApp.exe 时,您会希望它在发布模式下链接到 YourLibrary.dll。您可以保持 DLL 名称相同并使用目录来消除歧义:然后您在调试模式下链接到 bin\debug\YourLibrary.dll,在发布模式下链接到 bin\release\YourLibrary.dll。抱歉,如果这超出了您的问题范围,很高兴知道您何时第一次切换构建配置并且突然开始出现链接器错误。

【讨论】:

  • 小心使用/MTd 构建的YourLibraryD.dll。您不能像那样分发这些内容(违反 Microsoft EULA)。
  • @PaulMcKenzie 你确定吗?我认为您无法分发 Debug MSVCRT.DLL,但您应该能够分发针对它构建的自己的库。
  • 是的,您不能分发 MSVCRTD.DLL。问题实际上源于声称只有调试版本的程序工作的程序员,并试图分发它(提示他们也分发“MSVCRTD.DLL”)。
猜你喜欢
  • 2010-11-08
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多