使用静态库构建 dll

发布于 2024-10-19 00:03:24 字数 593 浏览 0 评论 0原文

我想构建一个 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。

I want to build a DLL to use it as an IIS/ISAPI application. So far so good. It works. However, I have to drag arround the runtime dll and other dependencies (like some boost libraries).

I would like to make a single DLL (in order to ease the deployment on multiple servers).

So I changed the switch from /MD to /MT. However, now I get errors of duplicate symbols during link. For example :

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

I'm puzzled that /MD or /MT are compiler flags and not linkers flags. And it could in some way explain why I get duplicated symbols (as the will be included in each .obj).

So the question is: how do I configure visual studio 10 in order to get a dll that includes all its dependencies.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小姐丶请自重 2024-10-26 00:03:24

/MD/MT 开关仅适用于 Microsoft C 运行时库,不适用于第 3 方库。 本文档提供了一些有关原因的信息它是一个编译器开关(它们会导致在编译期间创建不同的定义)。

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

The /MD and /MT switches only apply to the Microsoft C runtime library and not 3rd party libraries. This documentation gives some information on why it is a compiler switch (they cause different defines to be created during the compilation).

Pulling 3rd party DLLs directly into your own DLL as static libraries is probably not a simple process unless static libraries already exist. I don't know of any standard method for turning a DLL into a static library. A quick Internet search indicates that there exist tools that claim to do that process (my quick search did not turn up any free ones). But I think the most robust solution would be to use existing static libraries if you can. I believe you can build static versions of the Bools libraries, which you could then specify in your link statement in Visual Studio (as opposed to naming the libraries for the DLLs).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文