【问题标题】:How do I statically link a library into a DLL?如何将库静态链接到 DLL?
【发布时间】:2015-08-24 15:05:13
【问题描述】:

我在 DLL 地狱。我有 2 个 DLL,比如说 A.dll 和 B.dll,它们有名称冲突 - 每个都使用相同的 C++ 类名,等等。这两个 DLL 都可用作静态库。

我可以创建一个“包装”DLL,比如 Aprime.dll,它导出与 A.dll 中类似的类、方法等,并将功能委托给 A.lib 中的类,但静态链接到 Aprime .dll?这不是避免名称冲突吗?

我一直在尝试这个,但不确定我是否正确设置了 MSVS 项目。 Aprime.dll 正在生成,但根据 Dependency Walker Aprime.dll 仍在加载 A.dll。

我一直在搜索,但我发现的大多数内容仅适用于 CRT 或 MFC 中的静态链接,它们有自己的开关。

我在 Linker -> Input -> Additional Dependencies 下添加了 A.lib。

我是否遗漏了一些神奇的链接器命令行开关之类的东西?

【问题讨论】:

  • 我假设这是一个 c++ 问题,所以我添加了标签。它将获得更多的页面浏览量。如果我错了,请删除标签。
  • 如果您不想加载 A.dll,您当然必须删除 A.lib。如果这会导致链接器错误,那么您将不得不做更多的思考。
  • 汉斯,我不明白 - A.lib 不是静态链接文件吗?
  • 请注意,Windows 并不关心 DLL 中的名称冲突。例如。他们倾向于拥有DllMain

标签: c++ visual-studio dll


【解决方案1】:

是的,该方法应该有效。但关键是确保您不将任何原始 A.dll 头文件包含在 Aprime.dll 头文件中。否则,如果有人包含 Aprime.h/pp,那么它将包含 A.h/pp,然后您将再次发生冲突。

所以你想要这样的东西:

啊.h

// Library A includes
class test
{
};

B.h

// Library B includes
class test
{
}

Aprime.h

// Proxy class
class myTest
{
}

Aprime.cpp

#include "A.h"
#include "Aprime.h"

...

main.cpp

#include "Aprime.h"
#include "B.h"

...

请注意,main 永远不会同时包含 A 和 B。in 仅包含 Aprime 和 B。B 仍然是静态库,而 Aprime 是 DLL。

【讨论】:

  • 所以它可以工作,那么我一定做错了,因为我的 Aprime.dll 正在加载 A.dll - 如果 A.lib 静态链接到 Aprime.dll,它不应该。
  • 您确定您使用的 .lib 是静态库,而不是 .dll 的加载程序吗?
  • 克里斯,我该如何验证或确认?我已经添加了 .lib,我只需要这样做吗?
  • 我从来不需要检查,如果我这样做了,我只需创建一个控制台应用程序,包含该库,然后查看它是否运行。如果它抱怨 .DLL 丢失,那么它是一个 lib 版本。我确实找到了这篇文章:stackoverflow.com/questions/6402586/…
  • 我使用了您在该链接中建议的库工具,并且我使用的是导入库而不是静态库。我无法获得真正的静态库,我想我已经筋疲力尽了。但是感谢您的帮助。
【解决方案2】:

是的,您可以,Windows 的very low level 支持它。 Aprime.DLL 实际上是空的,除了一堆对 A.DLL 的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2018-06-02
    • 2011-05-21
    • 2010-09-30
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多