我现在如何知道哪些 DLL 是 C++ 的一部分?
Posted
技术标签:
【中文标题】我现在如何知道哪些 DLL 是 C++ 的一部分?【英文标题】:How do I now which DLLs are part of C++? 【发布时间】:2013-04-06 19:40:10 【问题描述】:我已经在 Dependency Walker 中打开了我的程序。它显示了以下 DLL:
GDI32.DLL OLEAUT32.DLL IMM32.DLL WINMM.DLL KERNEL32.DLL USER32.DLL SHELL32.DLL OLE32.DLL ADVAPI32.DLL WS2_32.DLL MSVCP100.DLL MSVCR100.DLL所以我猜其中一半是 Windows 的一部分,另一半是 C++ 的一部分,对吧?找出哪些是操作系统的一部分,哪些不是?
【问题讨论】:
我怀疑这里是否真的有答案——DLL 只是函数的集合。事后,将其中一些分类为 X 的一部分与 Y 的一部分完全取决于我们。 所以我运气不好?我正在尝试将所需的 DLL 打包到一个文件夹中。我不能使用安装程序,因为目标机器要求不使用安装程序。我不能使用 -MT 标志,因为它使用 Qt 库。 这就是我用来获取 DLL 列表的方法。这就是 Dependency Walker。 Microsoft 包含一个可再发行组件列表。这就是您可以/不能包含在您的应用程序中的内容的指南。对于大多数事情,vc_redist.exe 是要包含的主要内容。 如果您坚持这种无安装程序的立场,Windows DLL 的更新很有可能会破坏您的安装。安装程序数据库有助于跟踪哪些应用程序依赖于哪些 DLL,并且没有关于您的应用程序的信息很容易破坏。查看并行 DLL 概念... 【参考方案1】:不要打包任何您自己没有明确添加到项目中的 DLL。
阅读您的工具链(Visual Studio 或其他)的文档,以了解您是否需要在包中包含任何 可再发行组件。这些可能包括一些 DLL。
如果您不允许发布安装程序(微软产品的上述可再发行组件通常采用这种形式),那么您不应简单地手动转储DLL。您应该在您的发行说明中注明这些依赖项必须已经安装在目标系统上。您将它们作为您的应用程序的先决条件。
【讨论】:
如果没有安装程序,您将如何安装可再发行组件:“我无法使用安装程序,因为目标机器要求不使用安装程序。” @Lol4t0:请指点我说我们不会使用安装程序的地方。 从@user87504 对问题的评论中查看我的引文。 @Lol4t0:啊,我明白了。好吧,我拒绝这个前提。如果不允许安装程序,则也不允许随机转储系统 DLL。相反,OP 应该寻求:(a) 获得使用安装程序的许可,(b) 只需在其应用程序的发行说明中注明“VS 2008 [或其他] 的可再发行组件是先决条件,并且必须在系统上可用”。工作完成。 @user87504:那就更糟了!偷偷摸摸的【参考方案2】:MSVCP100.dll 和 MSVCR100.dll 包含 C 和 C++ 的运行时库。列表中的其他所有内容都属于 Windows。确定 DLL 是否属于 Windows 的一种方法是查看它的路径 (c:\windows...),然后检查来自 MS 的数字签名。这不是万无一失的,但它会让您更接近确定 DLL 是否属于 Windows。
编辑:请参阅 Lightness Races In Orbit 关于分发 Windows DLL 的this 回答
【讨论】:
太棒了!我最终使用“搜索一切”(谷歌搜索)来搜索我硬盘上的每个 DLL。如果 DLL 仅位于 SysWOW64/System32/WinSxS 文件夹中,则它是 Windows 自带的。 @user87504:您绝对不应该发送在这些文件夹中找不到的任何 DLL。 请不要这样做。当我不小心安装了你写的任何东西时,你可能会破坏我计算机上的依赖项(纯粹出于无知)。 轻盈是对的。我没有意识到您的意图是打包 Windows DLL 以进行分发。【参考方案3】:除了使用 Google 查找之外,可能没有简单的方法可以分辨。但是,在这种情况下,我可以告诉你,MSVCP100.DLL
是 C++ 标准库代码,MSVCR100.DLL
是 C 运行时库。
【讨论】:
【参考方案4】:Dependency Walker 本身具有“已知系统 DLL”列表。您可以在选项 -> 配置模块搜索顺序菜单中找到它。
【讨论】:
以上是关于我现在如何知道哪些 DLL 是 C++ 的一部分?的主要内容,如果未能解决你的问题,请参考以下文章