使用 LTO 静态 linked 可执行文件(link 时间优化):如何使用以前构建的库制作它
Statically linked executable with LTO (link time optimization) : how to make it with previously built libraries
在使用 g++4.9 的 Ubuntu 上,我按照它的说明构建了一个静态库(称之为 libZeroMQ.a),并且它是在没有“-flto”的情况下构建的(link 时间优化).
现在我正在开发一个使用 libZeroMQ.a 的项目(称之为 MyEXE),我将静态 link 所有库。我想用 LTO 构建 MyEXE。
我有两个选择:
A) 构建 MyEXE,在编译和 linking 中使用“-flto”。 Link 与之前构建的 libZeroMQ.a.
B) 破解(更改)ZeroMQ 的 config/build 脚本,添加“-flto”,并重建 libZeroMQ.a。然后通过 link 使用新的 libZeroMQ.a 构建 MyEXE。当然,在编译和 linking MyEXE 时仍然使用“-flto”。
关于MyEXE的性能,我认为:
B) 比 A) 好,因为它允许在 link 时间考虑更多代码(具体来说,ZeroMQ 中的代码)进行优化。
A) 仍然比根本不使用 LTO 好。
我的理解对吗?谢谢!
我真的很难将其作为一个答案而不是评论,但它是一个答案:
是的,你的理解是正确的。
在使用 g++4.9 的 Ubuntu 上,我按照它的说明构建了一个静态库(称之为 libZeroMQ.a),并且它是在没有“-flto”的情况下构建的(link 时间优化).
现在我正在开发一个使用 libZeroMQ.a 的项目(称之为 MyEXE),我将静态 link 所有库。我想用 LTO 构建 MyEXE。
我有两个选择:
A) 构建 MyEXE,在编译和 linking 中使用“-flto”。 Link 与之前构建的 libZeroMQ.a.
B) 破解(更改)ZeroMQ 的 config/build 脚本,添加“-flto”,并重建 libZeroMQ.a。然后通过 link 使用新的 libZeroMQ.a 构建 MyEXE。当然,在编译和 linking MyEXE 时仍然使用“-flto”。
关于MyEXE的性能,我认为:
B) 比 A) 好,因为它允许在 link 时间考虑更多代码(具体来说,ZeroMQ 中的代码)进行优化。
A) 仍然比根本不使用 LTO 好。
我的理解对吗?谢谢!
我真的很难将其作为一个答案而不是评论,但它是一个答案:
是的,你的理解是正确的。