【问题标题】:How to link a .DLL statically?如何静态链接.DLL?
【发布时间】:2010-09-30 06:09:31
【问题描述】:

我们有一个由 VS 构建的(纯原生 C++).DLL。作为客户端,我们有一些本地 C++ 应用程序和一个围绕这个用 C++/CLI 编写的 DLL 的 .Net-Wrapper。最后还有一些用 C# 编写的 .Net-Wrapper 客户端应用程序。

我的问题是,native.dll 的分发方式必须与 .Net 世界的工作方式不同,并且 VS 不会跟踪该 DLL。 因此,为了让我的所有 C# 应用程序正常工作,我必须将其复制到每个可执行目录或将其放在 %PATH% 中的某个位置(我会避免在开发人员计算机上这样做,因为他们可能希望使用不同版本的 DLL 启动不同的应用程序)。 如果有引用 Wrapper-DLL 的 UserControl 会出现更大的问题:您必须将 DLL 复制到 VS 的目录或再次复制到 %PATH%。 但最坏的情况发生在我们的翻译工具上。该工具跟踪 .Net-Assemblies 并将它们打包到可以发送给外部翻译器的翻译器包中。据我所知,没有办法将本机 .DLL 放入该包中!

所以我计划将本机 DLL 静态链接到 .Net-Wrapper 中,这将解决我的问题。 但是对于我们的原生应用程序,这个原生 DLL 必须仍然是一个 DLL。

所以我有两个选择:

  • 为此制作两个项目(一个生成静态库;一个创建动态库 => 我尽量避免这种情况)
  • 找到静态链接 DLL 的解决方案
  • 想办法让 VS 从一个项目中生成两个输出

【问题讨论】:

  • 我在这里可能有点傻,但我不明白为什么你的原生应用程序不能使用原生 dll,而你的 .net 应用程序使用 c++/cli 包装的 dll。
  • 两者都可以。但是 Wrapper-DLL 引用了本机 DLL,因此我的 C# 应用程序两者都需要。这对于包装器来说是可以的,但对于本机 DLL 来说是痛苦的。
  • 为什么不为 dll 构建一个库?你说你用VS构建dll,不是吗?
  • 这将如何在 Visual Studio 2019 中完成? stackoverflow.com/questions/67097557/…

标签: c++ dll linker static-linking


【解决方案1】:

在 dll 的 C++ 项目文件中,创建两个配置,一个生成 DLL,一个生成 .lib。两个项目不是必需的,因为任何 .NET/C++ 项目都可以支持多个构建配置(这就是 Release 和 Debug 版本构建不同的方式)。

【讨论】:

  • 但是没有办法一次性构建同一个项目的两个配置,是吗?通常,您可以在配置管理器中为解决方案配置/平台选择一个项目配置/平台。
  • 您可以复制项目,并在该解决方案中配置第二个项目。不要忘记设置不同的中间目录的
【解决方案2】:

另一种选择是拥有两个项目,一个项目将输出一个可以静态链接的 .lib,第二个项目将输出一个 .dll 并将您的 .lib 作为依赖项,您应该将 .def 添加到您的.dll 包含您计划导出的符号,否则它将为空。

【讨论】:

  • 听起来不错。我会试一试。目前,我通过将 obj 文件作为附加输入添加到 Wrapper-DLL (../NativeLib/$(PlatformName)/$(ConfigurationName)/*.obj) 中的链接器来解决问题。但这有点粗糙,你的选择听起来更好!
  • 谁能解释一下 .lib 和 .dll 在这种情况下是如何区分的?
  • 在 Visual Studio 中,您有两种不同的应用程序类型“静态库”和“DLL”。 “静态库”选项创建一个“.lib”文件,但它不能直接执行,目标代码放在一起没有处理。 “DLL”选项将创建一个可执行的“.dll”(即您可以通过 LoadLibrary 使用它),处理目标代码以解析函数调用,优化。
【解决方案3】:

获取DLL to Lib 的副本(编辑:如果您找不到更便宜的选择)

【讨论】:

  • 有点贵,不是吗?
  • 考虑到您已经拥有 DLL 的源代码,这尤其昂贵。您可以简单地将其重新编译为静态库文件。但是 .Net 不会使用它,因为 .Net 不做 lib 文件。这也意味着 DLL To Lib 对您没有帮助。
  • 是的,刚刚检查过,我运行的是 1.42,2003 年的价格是 99 美元,当时这个价格还可以。
  • 如果您有 dll 的源代码,只需构建一个 lib 并使用它来静态链接?或者你没有dll的来源?
  • 如果 DLL To Lib 可以工作,那么你就不需要它了。 VS 已经完全有能力从您的代码中创建一个 lib 文件。如果您可以将 .lib 文件链接到您的 .Net 项目,请执行此操作。不过,我的印象是 .Net 程序集无法链接到本机 .lib 文件。
【解决方案4】:

您可以使用dllexport 生成一个 dll 并将入口点导出到一个库,这里对此进行了解释

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多