构建DLL时;我应该链接什么类型的CRT?

问题描述:

在windows中;有2个选项链接到CRT:构建DLL时;我应该链接什么类型的CRT?

  1. 多线程,静态链接
  2. 多线程,动态链接

有人可以阐明什么是这里最好的做法有些轻?我应该“静态”链接到CRT还是动态链接?

如果我做了一个动态链接,并且我编写了一个使用我的DLL +另一个第三方DLL(这是一个静态链接到CRT)的程序,这是一个问题吗?

+0

通常我会推荐多线程。第三方DLL应该不会造成问题,因为链接器应该只能看到这些DLL的导入LIB。 – 0xC0000022L 2011-03-10 16:20:55

+0

@STATUS我认为这里给出了多线程,Q是静态或动态的。 – 2011-03-10 19:15:17

+0

@David:......这就是为什么我的评论的大部分回答了这个问题的原因;) – 0xC0000022L 2011-03-10 19:30:02

在应用程序中使用DLL时,这是一件大事。很重要的是 EXE和DLL使用相同的内存分配器。如果你从需要由调用者释放的DLL函数返回指针或C++对象(如std :: string)。要获得相同的分配器,所有模块必须使用CRT的相同实例。如果你使用/ MD编译来选择CRT的DLL版本,你只会得到。 它们必须全部使用相同版本的CRT。无论如何,使用/ MT会导致很难诊断内存泄漏,如果幸运的话会导致访问冲突。

使用/ MT可以更轻松地部署您的应用程序,因为您不必安装运行时DLL。正如所暗示的,如果你只需要部署一个EXE,这只是安全的。或者当你非常小心地控制你的DLL的公共接口。例如,自动兼容的COM服务器可以链接到CRT的静态版本。自动化有关于交换指针和管理内存的严格规则。

+0

@Hans当然,所有理智的开发都涉及到在同一个库中的分配和释放(在库中,我允许可能有多个DLL,或一个EXE和一些DLL)。在这种情况下,您肯定可以连接静态或动态CRT,并且选择归结为偏好和卫生因素。 – 2011-03-10 19:16:43

+0

@David:你认为从函数返回一个std :: string是否合理? DLL分配它,EXE释放它。需要动态CRT。 – 2011-03-10 19:26:01

+0

@David:不,它不。即使在动态链接时,错误可能会比将一个库的调试版本与另一个库的发行版本混合在一起微妙。除此之外,还有'IMalloc'。 – 0xC0000022L 2011-03-10 19:29:10