为什么我需要为静态lib构建指定运行时库类型?

时间:2014-12-03 16:16:46

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

  

或者它只是链接器的信息,以便在链接最终时   exe(dll)它知道要使用哪个版本的运行时库   特别是静态库?

  

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

我强烈建议。如果你没有,你会得到一堆链接器错误。

  

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

是。

如果要释放要由第三方使用的DLL,您可能需要为它们提供使用/ MTd标志的YourLibraryD.dll和使用/ MT的YourLibrary.dll。每个都有不同的解决方案配置。没有人再使用单线程版本了,因为性能损失现在大多不相关,不值得冒险。

编辑:即使您没有发布到第三方,您仍然希望确保在调试-vs-释放模式下链接到正确的DLL。这是因为当你在Debug中使用/ MTd构建YourApp.exe时,你会希望它链接到YourLibraryD.dll。在Release中构建YourApp.exe时,使用/ MT,您将希望它在发布模式下链接到YourLibrary.dll。您可以保持DLL名称相同并使用目录消除歧义:因此,您将在调试模式下链接到bin \ debug \ YourLibrary.dll,并在发布模式下链接到bin \ release \ YourLibrary.dll。很抱歉,如果这不是您的问题,那么最好先知道何时切换构建配置,然后突然开始出现链接器错误。

相关问题