【问题标题】:Windows dependencies when statically linking静态链接时的 Windows 依赖项
【发布时间】:2015-02-15 14:31:47
【问题描述】:

我在 Windows 上使用 GCC 4.8.2 (MinGW) 进行编译。我在我的程序中使用 openMP。当我在没有 -static 标志的情况下编译时,我从 dumpbin /dependents myapp.exe 得到这个输出:

Dump of file myapp.exe

File Type: EXECUTABLE IMAGE
  Image has the following dependencies:

    KERNEL32.dll
    msvcrt.dll
    USER32.dll
    libgomp-1.dll

现在将 libgomp-1.dll 包含在与 myapp.exe 相同的文件夹中是不够的,因为这取决于更多的 .dll(libwinpthread-1.dll 和 libgcc_s_seh-1.dll),而 dumpbin 只会进入一级深。

现在我在编译标志中包含 -static 进行编译,并从 dumpbin 中获得以下输出:

File Type: EXECUTABLE IMAGE

  Image has the following dependencies:

    KERNEL32.dll
    msvcrt.dll
    USER32.dll

它现在可以在没有 libgomp-1.dll 所依赖的 .dll 的情况下工作吗? GCC 是否也包含这些库的静态版本? dumpbin 是否能够检测到这些新依赖项?
(我可能在这里有点偏执,但这些东西很难在本地机器上测试,因为我在 PATH 的许多地方都有这些 dll)

【问题讨论】:

  • kernel32 和 user32 库是操作系统的一部分。它们不能静态链接(因为这意味着在您的可执行文件中复制操作系统的一部分,这没有意义),但出于同样的原因,它们不需要链接。

标签: windows gcc dll dependencies mingw


【解决方案1】:

您不能将 MSVCRT(Windows C 库)静态链接到 MinGW,但这应该不是什么大问题。 MSVCRT.dll、KERNEL32.dll、USER32.dll 应该出现在所有 Windows 版本上。您无需重新分发它们。

【讨论】:

  • 问题不在于与 MSVCRT 的链接,而是在于如果 dumpbin 将检测现在静态包含的 libgomg-1.dll 的依赖关系的问题(它在使用 -static 之前没有,因为它只分析一个等级)。很抱歉不清楚。
  • @Piotr Lopusiewicz:是的,当然,它只会显示为 myapp.exe 的依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多