33

我在 Windows 上使用带有 GCC/MinGW 的 Code::Blocks IDE,并且我正在尝试构建一个 wxWidgets 应用程序,该应用程序具有 ca. 20k 行和 40 个源模块。它的构建非常非常缓慢。

编译一个 C++ 模块需要 2-5 秒,链接甚至需要 2-3 分钟。

这是一个可移植的代码,而且这个代码在 Linux 上编译得非常快。我无法跟随构建消息窗口...整个过程持续不到 20 秒。

我尝试了常见的调整(例如,预编译头文件、关闭优化等),但没有任何效果。

为什么这么慢?

4

4 回答 4

19

您是否在 Active Directory 域中,但没有立即连接到它?

虽然我没有关于为什么 MinGW 会变慢的“答案”,但根据我的经验,属于 AD 域但无法访问 AD 控制器的计算机在启动可执行文件时会出现延迟(例如rxvt.exe)和当前正在运行的程序会遇到暂停或卡顿(例如使用 MinGW 构建的 emacs)。

我仍在调查以确定这种行为的实际原因,但我想我会提到它以防它适用于你。

于 2009-12-08T16:43:23.727 回答
16

从 开始MSYS 1.0.19-1,如果用户帐户位于 Active Directory 域中并且无法访问域控制器 (DC),则MSYS DLL在启动任何 MSYS 可执行文件(使用MSYS DLL)之前将引入很长的延迟。这会影响 MSYS和 CoreUtils 包中的make所有命令行实用程序,例如通常安装在.lsrmC:\MinGW\msys\1.0\bin

观察:

  • 从 MSYS bashshell 启动实用程序时,只有 shell 的启动会受到延迟。从 shell 启动的实用程序不受影响。

  • 延迟可能会有所不同,在我的情况下是 21 秒。

  • 在延迟命令后的 10-20 秒内运行任何 MSYS 实用程序将启动,不会出现新的延迟。
  • 当机器连接到不同的网络,或者从其域断开连接,或者域控制器主机名更改时(在我的情况下是问题),就会出现问题。要检查 DC 是否可访问,请打开cmd并键入echo %LOGONSERVER%,然后pingnet view使用 DC 的主机名。

为什么这么慢:

  • MSYS DLLin的代码进行了uinfo.cc internal_getlogin()两次系统调用来获取用户信息。第一次调用NetUserGetInfo()以从本地计算机检索用户帐户。它对域用户失败,因此它第二次调用它,DC 服务器取自LOGONSERVER变量。如果无法立即访问此主机,则会引入很长的延迟,直到调用超时失败。该应用程序将在不久后启动。

如何避免这个问题,几种解决方法:

  • 从 MSYS shell 运行所有内容,或者
  • 如果原因是 DC 主机名更改,则重新启动或重新登录将解决问题。LOGONSERVERWindows 将使用正确的 DC 主机自动更新。
  • cmd如果从 Windows或脚本 调用 MSYS 工具,则设置LOGONSERVER为 localhost 以避免网络访问。例如set LOGONSERVER=\\LOCALHOST为我工作。cmd注意:此变量在登录时设置,并且在 Windows 环境变量窗口中全局更改它与在脚本中设置它相比没有效果。
  • 我认为这是 MinGW/MSYS 中的一个错误。MSYS2 和 Cygwin 中的代码是不同的。我检查了 MSYS2 并没有这样的问题。
于 2017-05-07T10:08:16.677 回答
11

MinGW 上的许多“unixy”东西都非常缓慢,因为 Windows 没有fork(). Windows 只有CreateProcess(),这是完全不同的。Unix shell 和 GNU Make 做了很多分叉,所以在 MinGW 下运行这些会导致“模拟”分叉,这真的很慢。

受此影响的另一件事是 GNU Autotools,因此./configure在从源代码构建“unixy”应用程序时运行脚本也非常慢。如果您需要多次执行此操作(例如在获取配置以查找所有库时遇到问题时),这可能会变得非常烦人。

这个答案更详细地解释了 Cygwin 和 MinGW如何模拟fork()的,这个答案有更多最新的解释。

于 2015-04-21T08:18:31.303 回答
-1

您可以尝试使用更新版本的工具集。我发现这很有用:http: //nuwen.net/mingw.html 它在一个大包中包含了 MinGW 使用的所有工具和常用 API。从网站:

我的 MinGW 发行版(“发行版”)是 x64-native,目前包含 GCC 6.1.0 和 Boost 1.61.0。

MinGW 是 GCC 到 Windows 的一个端口。它是免费的且易于使用(嗯,就像工具链一样简单)。它生成可以以任何方式分发的独立 Windows 可执行文件。

于 2009-12-08T17:20:36.787 回答