2011-02-25 125 views
1

我想构建一个DLL来将其用作IIS/ISAPI应用程序。到现在为止还挺好。有用。不过,我必须拖动运行时DLL和其他依赖关系(如一些boost库)。用静态库构建一个DLL

我想制作一个DLL(为了简化在多个服务器上的部署)。

因此,我将开关从/ MD更改为/ MT。但是,现在我在链接期间出现重复符号的错误。例如:

msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream<char,struct std::char_traits<char> >::`vbase destructor'(void)" ([email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in gateway.obj 

我很疑惑/ MD或/ MT是编译器标志而不是连接器标志。它可以以某种方式解释为什么我得到重复的符号(因为将包括在每个.obj中)。

所以问题是:我如何配置visual studio 10以获得包含所有依赖关系的dll。

回答

1

/MD/MT交换机仅适用于Microsoft C运行时库而不适用于第三方库。 This documentation给出了一些关于它为什么是编译器开关的信息(它们导致在编译过程中创建不同的定义)。

将第三方DLL直接引入到您自己的DLL中作为静态库可能不是一个简单的过程,除非静态库已经存在。我不知道任何将DLL转换为静态库的标准方法。快速的互联网搜索表明,存在声称做这个过程的工具(我的快速搜索没有出现任何免费的搜索)。但是我认为最健壮的解决方案是尽可能使用现有的静态库。我相信你可以构建Bools库的静态版本,然后你可以在你的Visual Studio中的链接语句中指定(而不是命名DLL的​​库)。

+0

谢谢......这只适用于运行时造成的事情方式更简单的小信息;) – 2011-02-25 16:44:29