【问题标题】:How can I reduce the Linking (and Relinking) time of MinGW with Qt/QtCreator?如何减少 MinGW 与 Qt/QtCreator 的链接(和重新链接)时间?
【发布时间】:2022-12-20 04:18:20
【问题描述】:
我有一个程序,其规模在几年内不断扩大。随着它的增长,编译和链接的时间也在增长。对于大约 100k 行的程序,现在大约需要 8 分钟才能完成重建,并且如果单个文件已更改,将近 3 分钟重新链接.收获?在 Linux 上运行相同的构建仅需 3 分钟,而链接时间几乎不存在。
更多信息:
- 两种编译均在具有相对相同规格(RAM、CPU 速度、内核等...)的计算机上执行
- 必须使用 MinGW 以保持低级编译器兼容性(使用
__attribute__((packed)) 以确保程序之间的最小数据包大小
- 由于多种原因,我无法使用 MinGW-810 或更高版本的 32 位和 64 位 Qt 5.15.2
- 许多小型静态库被用作构建过程的一部分(主要代码约为 60k 行,其余代码被打包到许多小型静态编译库中)。
- 使用CMake编译
问题不在于初始构建,而是重新链接的时间实在是太多了。我怎样才能将链接和重新链接时间缩短到更接近我在 Linux 上体验的时间,而无需更改编译器或不必做一些疯狂的事情,比如在 Linux 上交叉编译 Windows?
【问题讨论】:
标签:
c++
qt
compilation
linker
mingw
【解决方案1】:
研究这个问题让我走上了很多不同的道路,所以我想与其他人分享我的经验,希望能为您节省数天和/或数周的时间。让我从解决方案开始,然后我将回过头来解释我使用过的备选方案:
解决方案:
解决方案是下载LLVM Compiler Infrastructure,然后直接从安装路径复制lld.exe并将其粘贴到您的 Qt 工具链中。例如,如果您的 Qt 安装位于此处:C:Qt 然后将 lld.exe 复制到 C:QtToolsmingw810_32in(对于 32 位),重命名至ld.exe 并重建您的应用程序。这将我的重新链接时间从大约 2 分 45 秒减少到 10 秒,和Qt 建设部。
笔记:
我仍在更仔细地研究 Qt 是如何搜索链接器的。我开始重命名所有ld.exe 文件,发现简单地重命名文件并不一定会阻止 Qt 链接。也就是说,为了识别要精确复制的ld.exe,我会将 32 位 mingw 目录中的 ld.exe 重命名为 ld.exe.bak。为 32 位编译的程序仍然可以成功链接。这可能表明 CMake/Qt 工具链能够选择 64 位 ld.exe,但我还不确定这一点。
其他尝试:
-
-保险丝-ld=lld:我不是 Windows 用户,虽然事实证明此链接器标志适用于 MinGW 11,但即使将 lld.exe 添加到 Window 的 PATH 时,我也无法识别此链接器。我的目标是更改链接器,而不必直接使用 Qt 安装。
-
PIMPL:我检查了整个程序,确保每一个结构、每一个类都在可能的情况下被正确地向前声明,减少了头文件中包含的头文件的数量。此外,我确保抽象可以发生的地方,它确实发生了。我们一直在练习这个,所以变化和我预期的一样大。
-
静态库的静态库: Elsewhere it was suggested that 可以通过制作一个包含其他静态库的大型静态库来减少链接时间。事实证明这没有任何效果。
我希望这可以帮助那些可能正在为重新链接时间而苦苦挣扎的其他人。