Visual Studio:如何为链接器指定不同的运行时库? (/ MTd,MDd等)

时间:2010-11-29 19:48:56

标签: c++ visual-studio-2008 visual-c++ dll linker

我正在链接到VS2008中的一些库。如果我对链接器的了解是正确的,那么MTd用于静态链接,MDd用于动态链接(到DLL)。我的目标是静态链接一些库和动态链接其他库。项目选项似乎只对链接器输入中的所有库有一个设置。我该怎么做?

3 个答案:

答案 0 :(得分:4)

根据您回答“新建项目向导”提示的方式,在设置项目后,您的项目将获得合理的C运行时库默认值。您可以按如下方式检查和更改(如果需要):

  • 在解决方案资源管理器中右键单击相关项目,选择“属性”
  • 查看配置属性,C / C ++,代码生成,运行时库。

可以根据需要链接其他库,只需指定要链接到链接器,输入,附加依赖项下的库。

即使您链接到DLL,它仍然会有一个.LIB文件(DLL的正确格式)来解析外部引用,除非您手动加载DLL并发现所需的函数入口点。

您确实需要确保您链接的LIB文件使用与您的应用相同的CRT,否则可能会出现意外错误。

答案 1 :(得分:4)

不,你把它搞混了。 / MD vs / MT选项仅与您链接的CRT版本相关。有两个,静态版本(/ MT),只有在项目中不使用任何DLL时才应使用。还有DLL版本,你的进程中的每个二进制文件都可以共享的版本,这样你就不会有堆分配的痛苦。当内存由一个模块分配并由另一个模块释放时,你会遇到的痛苦。

选择自己的库完全取决于您。混合和匹配很好,链接器只是获得另一种.lib。导入库而不是静态库。请记住在使用DLL时使用/ MD。

答案 2 :(得分:0)

您描述的链接器选项仅适用于CRT。静态版本将限制您在模块之间共享内存的方式。

您使用的所有其他库都将根据您提供(或不提供)链接器的.lib文件进行链接。

有三种使用MS库的方法

  1. 静态链接静态库(.o存档.o的.lib equivelant)
  2. 静态链接动态库的存根(.lib编译器生成的loadlib / getproc)
  3. 手动加载动态库(loadlib / getprocaddress)