c++ mold链接器使用 c++如何配置mold作为高速链接器

冬辰姑娘_1003

冬辰姑娘_1003

2026-03-25

692人浏览

原创

mold 通过 C++20 重写、robin-hood hash、并行 I/O 和多线程显著加速链接,中大型项目可从 12s 降至 1.8s,但仅支持 Linux/FreeBSD,需在 CMake 中显式配置 -fuse-ld=mold 并验证生效。

c++ mold链接器使用 c++如何配置mold作为高速链接器

为什么用 mold 替换 ld 或 lld 能明显提速

链接阶段慢,往往不是编译器的问题,而是传统链接器(ld.bfd)在符号解析、重定位、段合并时做大量重复扫描和哈希查找。mold 用 C++20 重写,内存布局更紧凑,符号表用 robin-hood hash,支持并行 I/O 和多线程处理,实测中大型 C++ 项目(如含 500+ 目标文件的构建)链接耗时可从 12s 降到 1.8s 左右。但它不兼容所有 GNU ld 特性,比如部分 --wrap 行为或某些 .so 版本脚本语法。

如何让 CMake 项目真正用上 mold

CMake 默认不会自动选 mold,即使它已安装在 PATH。必须显式指定链接器路径,并确保 C++ 链接器和 C 链接器一致(否则混合链接会失败):

  • 在 CMakeLists.txt 最顶部加:
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=mold" CACHE STRING "")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=mold" CACHE STRING "")
    set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=mold" CACHE STRING "")
  • 或者更稳妥的方式:在命令行传入(避免污染缓存):
    cmake -DCMAKE_CXX_FLAGS="-fuse-ld=mold" -DCMAKE_C_FLAGS="-fuse-ld=mold" ..
  • 验证是否生效:编译后运行 readelf -l your_binary | grep interpreter,输出里应含 /lib64/ld-mold.so.1(Linux x86_64);若仍见 ld-linux-x86-64.so.2,说明没生效

mold 在 macOS 和 Windows 上能用吗

不能。mold 当前只支持 Linux(x86-64、aarch64、riscv64)和 FreeBSD。macOS 的默认链接器是 ld64(LLVM 系),Windows 是 link.exe 或 lld-link,二者都不支持 -fuse-ld=mold。尝试在非 Linux 平台硬配会导致 clang: error: invalid linker name in argument '-fuse-ld=mold'。CI 流水线若跨平台,需加条件判断,例如在 GitHub Actions 中只对 ubuntu-latest 环境启用该 flag。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

哪些 C++ 项目配置会让 mold 失效或报错

mold 对链接脚本、弱符号、版本控制等处理比 ld.bfd 更严格,以下情况容易出问题:

  • 使用自定义 .lds 链接脚本:若含 INSERT AFTER、SECTIONS { *(.init) } 这类模糊通配,mold 可能报 undefined symbol: _start 或段顺序错误;建议改用 mold --print-script 输出默认脚本再微调
  • 启用了 -Wl,--no-as-needed 但依赖库未显式列出:mold 默认更激进地裁剪未引用的库,漏写 target_link_libraries(...) 会导致链接失败而非静默忽略
  • 使用了 GCC 的 -fsanitize=address:需确保 libasan 是 mold 编译的版本(通常系统自带的没问题),否则可能报 cannot find -lasan;可用 mold --help | grep asan 查看是否内置支持

真正卡住的点往往是链接器标志传递链断裂——比如父项目的 CMAKE_EXE_LINKER_FLAGS 没 propagate 到子目录,或 Ninja 缓存了旧的 linker 参数。遇到“明明配了却还是用 ld.bfd”,第一反应不是重装 mold,而是检查 compile_commands.json 里实际生成的链接命令行有没有 -fuse-ld=mold。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2255

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3622

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1216

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4179

7

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3260

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

269

24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1049

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3300

5

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4618

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习