我正在 Windows 上使用带有 GCC/MinGW 的 Code::Blocks IDE,并且我正在尝试构建一个具有 ca 的 wxWidgets 应用程序。 20k 行和 40 个源模块。而且它的构建速度非常非常慢。
编译一个C++模块需要2-5秒,链接甚至需要2-3分钟。
这是一个可移植的代码,并且该代码在 Linux 上编译得非常快。我无法跟随构建消息窗口...整个过程持续不到 20 秒。
我尝试了常见的调整(例如,预编译头、关闭优化等),但没有任何效果。
为什么这么慢?
您是否位于 Active Directory 域中,但未立即连接到该域?
虽然我没有关于为什么 MinGW 会很慢的“答案”,但根据我的经验,属于 AD 域但无法到达 AD 控制器的计算机在启动可执行文件时会出现延迟(例如如 rxvt.exe)并且当前正在运行的程序会遇到暂停或卡顿(例如使用 MinGW 构建的 emacs)。
我仍在调查以确定此行为的实际原因,但我想我会提及它,以防它适用于您。
从
MSYS 1.0.19-1
开始,如果用户帐户位于 Active Directory 域中并且无法访问域控制器 (DC),则 MSYS DLL
将在启动任何 MSYS 可执行文件(使用 MSYS DLL
)之前引入较长的延迟。这会影响 MSYS make
以及 CoreUtils 包中的所有命令行实用程序,例如通常安装在 ls
中的 rm
、C:\MinGW\msys\1.0\bin
等。
观察:
从 MSYS
bash
shell 启动实用程序时,只有 shell 的启动会受到延迟影响。从 shell 启动的实用程序不会产生影响。延迟可能会有所不同,在我的例子中是 21 秒。
cmd
并输入 echo %LOGONSERVER%
,然后输入 ping
或 net view
以及 DC 的主机名。为什么这么慢:
MSYS DLL
中的uinfo.cc internal_getlogin()
代码进行了两次系统调用来获取用户信息。第一次它调用 NetUserGetInfo()
从本地计算机检索用户帐户。它对于域用户失败,因此它使用从 LOGONSERVER
变量获取的 DC 服务器第二次调用它。如果不能立即访问该主机,则会引入很长的延迟,直到调用超时失败。申请将很快开始。如何避免这个问题,几种解决方法:
LOGONSERVER
。cmd
或脚本调用 MSYS 工具,则将 LOGONSERVER
设置为本地主机以避免网络访问。例如。 set LOGONSERVER=\\LOCALHOST
对我有用。注意:此变量是在登录时设置的,与在 cmd
或脚本中设置它相比,在 Windows 环境变量窗口中全局更改它没有效果。MinGW 上的许多“unixy”东西都慢得令人痛苦,因为 Windows 没有
fork()
。 Windows只有CreateProcess()
,这是很不一样的。 Unix shell 和 GNU Make 进行了大量的分叉,因此在 MinGW 下运行这些会导致“模拟”分叉,这非常慢。
另一个受此困扰的是 GNU Autotools,因此在从源代码构建“unixy”应用程序时运行
./configure
脚本也非常慢。如果您需要多次执行此操作,这可能会变得非常烦人(例如,在使用 configure 查找所有库时遇到麻烦)。
这个答案更详细地解释了Cygwin和MinGW如何用来模拟fork()
,并且这个答案有更多最新的解释。
http://nuwen.net/mingw.html 它在一个大包中包含 MinGW 使用的所有工具和通用 API。 来自网站:
我的 MinGW 发行版(“发行版”)是 x64 原生的,当前包含 GCC 6.1.0 和 Boost 1.61.0。MinGW 是 GCC 到 Windows 的端口。它是免费且简单的 使用(嗯,就像工具链一样简单)。它产生独立的 可以以任何方式分发的 Windows 可执行文件。