使用静态库构建一个dll

时间:2011-02-25 13:38:46

标签: visual-studio-2010 dll isapi

我想构建一个DLL,将其用作IIS / ISAPI应用程序。到现在为止还挺好。有用。但是,我必须拖动运行时dll和其他依赖项(如某些boost库)。

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

所以我将开关从/ MD更改为/ MT。但是,现在我在链接期间遇到重复符号错误。例如:

msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream<char,struct std::char_traits<char> >::`vbase destructor'(void)" (??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in gateway.obj

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

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

1 个答案:

答案 0 :(得分:1)

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

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