【问题标题】:Use .dll to store other .dlls or .libs使用 .dll 存储其他 .dll 或 .lib
【发布时间】:2014-07-08 14:03:31
【问题描述】:

我正在使用 Visual Studio 2010,我正在尝试创建一个 .dll。我的 .dll 使用外部库 .lib。此库还包含其他库 (.lib) 的集合。

所以:我的 main.lib 是一个用于收集库的容器 - 因此它大约有 300mb 大。

现在,当我在我的 dll 中使用 lib 时,它的链接很好,并且可以在我的电脑上正常工作。但是当我将编译后的程序部署到另一台计算机时,它无法加载.lib。它根本找不到它,即使我把它放到.dll 的目录中。

现在我的问题是:有没有办法可以将 .lib 的所有功能存储在 .dll 中?这样 .dll 文件大约 300mb 大,但我不需要再部署 .lib 了吗?

更新:

非常感谢大家的回答。为了描述我的问题,我想向您展示我的程序的输出:

未处理的异常:System.Runtime.InteropServices.SEHException:外部组件已引发异常。

我花了很多时间使用谷歌来解决这个错误。我发现这是缺少文件的问题(我的“外部组件”之一(.dll))找不到类的定义等等,或者访问权限有问题。

我尽我所能解决这个问题,一次尝试我就成功了,可以使用这个程序。我知道这是因为我将 main.lib 放入了正确的文件夹中,所以我的程序可以找到它。但是现在我不知道把这个 main.lib 放在哪里。所以:我的程序又坏了,现在我想修复它......我希望这个描述有所帮助。很难描述,因为我不知道到底是什么问题……

更新 2:

感谢您的帮助,我解决了我的问题。起初我误解了 .dll 和 .lib 的工作原理。如果其他人有此问题并将被重定向到此帖子,那么@D Stanley 的回答会有所帮助。

感谢@David Heffernan,我发现它并没有丢失任何 .lib 或其他导致此错误的东西。这是我的本机 C++ 代码(在 .lib 中)中的一个问题。所以我修复了这个问题(导致异常),现在一切正常。

感谢大家的帮助。

【问题讨论】:

  • 您对问题的诊断不正确。我们首先需要正确识别问题,而不是询问您提出的解决方案。在运行时,不使用 .lib 文件。所以运行程序的机器上没有 .lib 文件不是问题。您需要备份并提供问题的更多详细信息。
  • 大卫您好,非常感谢您的回答!我在上一个问题中添加了更新。此更新是否有助于了解我的问题?
  • 正如我所说,您误诊了问题。所有关于 lib 文件的讨论都与问题无关。我不认为这个问题可以保存。您需要有关错误的帮助。问一个新的问题。有细节。很多细节。
  • 但我认为这个错误与我的问题有关。它告诉我,当我的程序尝试访问我的 main.lib 的代码时出现错误。所以我认为它找不到这部分的定义/声明。它在 .lib (和给定的 .h 文件)中。当我询问有关该错误的新问题时。我应该提供哪些细节?我不知道我应该提供哪些细节。我想我不能提供更多...:/
  • 不,它与任何 .lib 文件无关。但是你似乎不想听我的建议,所以我想这意味着我无法帮助你。祝你好运解决这个问题。很抱歉我帮不了你。

标签: c# c++ .net dll


【解决方案1】:

您不能静态链接其他静态库中的静态库。相反,您应该做的是静态链接 DLL 中的所有这些单独的静态库。链接器不会就此发出警告吗?

此外,您无法将静态库部署到另一台机器,因为它们无法在运行时链接。

【讨论】:

  • 您好 aevitas,非常感谢您的回答。为什么我不能在其他静态库中链接静态库?我正在尝试创建一个包含所有其他较小库的“容器”库。因为:在我的 dll 中,我只想引用一个库。所以我想:当我必须注意所有小的 .lib 都在正确的目录中时(在我的目标计算机上,而不是我的开发计算机上),这将非常困难。但是,当我只需要处理一个 .lib(所有较小 .lib 的 main.lib ~ 容器)时,它会更容易。但现在我明白了……这根本不是那么容易。
  • @user3816457 您根本不应该分发这些 .lib 文件,因为您将软件部署到的机器将无法使用它们。静态库的唯一目的是在编译时将 DLL 链接到 exe 文件,作为静态资源。与 DLL 不同,LIB 文件在运行时不能链接到,并且在编译时之外的任何其他时间点实际上都是无用的。
  • 感谢您的帮助!很抱歉我误解了.dlls和.libs的原理。我认为 .dlls 试图在运行时链接 .libs。你的帖子帮助我解决了我的问题。非常感谢。
【解决方案2】:

如果我了解您的情况:

  1. 您有多个静态库 (.lib)
  2. 它们被链接到一个大的静态库中 (main.lib)
  3. 您想在动态库中使用此库 (.dll)

我不确定本地发生了什么,但lib 文件在运行时没有“加载”——它们链接到的动态库> 在运行时加载(因此名称为“动态”或可执行文件本身。因此,如果您的应用程序现在正在运行,那么您要么已经将它的一部分链接到你的 dll 中,要么它正在被链接进入可执行文件。

所以要回答您的问题,是的,您可以将您的 lib 文件链接到您的 dll - 它会在其中包含所有必要的目标代码。请注意,它可能没有源库那么大 - 这取决于您的库使用了多少原始代码。

我也看不出 c# 是你情况的一部分。

【讨论】:

  • 你好,D 斯坦利。非常感谢您的回答。是的,你正确理解我的情况!好的,现在我明白了。 dll 足够“智能”,以至于只有 main.lib 的必要代码将包含在 dll 中?所以:当我有了 .dll 之后,我就不再需要 main.lib 了吗?我只需要它用于链接目的,对吧?我已经更新了我的主要帖子并发布了我的程序向我显示的错误。这可能与您的答案有关吗?要清除 C# 部分:我需要在 C# (ASP.NET) 应用程序中使用本机 C++ 代码。所以.lib自己的C++代码,main.lib是一个C++ Wrapper围绕...
  • ... 这个 .lib 的。在我的 .DLL 中,我有 C++/CLI 代码来访问 C++ Wrapper。然后我想在我的 C# 应用程序中使用它。我希望这个解释会有所帮助。
  • 正确,您不需要部署 lib 文件 - 链接器 将代码从 lib 拉入 DLL。我会对SEHException 做更多的研究并专注于它——lib 文件是一个红鲱鱼。
  • 地狱 D 斯坦利,非常感谢您的帮助。你的帖子让我大开眼界。我误解了.dll 和.lib 的原理。但是感谢您的帖子,我不会再犯这个错误了!谢谢你:)
【解决方案3】:

从您的描述看来,您正在链接 *.lib 存根,这些存根伴随 DLL 进行静态加载。您的计算机上有这些 DLL,但在您尝试使用 DLL 的其他计算机上没有。因此,为了使一切正常工作,请找到这些 DLL 并将其与您的 DLL 一起复制。

【讨论】:

  • 你好尤金,谢谢你的回答。我正在使用这些 DLL 将本机 C++ 库链接到我的 C# 软件。但是我已经将所有必要的 DLL 都放在了新计算机上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多