我有一组静态库,比如 lib1.a , lib2.a 和 lib3.a ,它们都是使用ICC编译的(英特尔C / C ++编译器)。我使用带有 -ipo -c 的ICC进行编译以创建 .o 文件,然后使用XIAR(英特尔Archiver)创建 .a 库。
我想将这三个库提供给没有ICC的客户端,因此将使用GCC来编译和链接她的应用程序与这些库。如果她使用GCC链接这些库,那么根本 >>是否会实现速度增益(通过使用 -ipo 选项构建的库进行跨文件优化)?
来自英特尔网站的This page" GCC兼容性和互操作性"规定:
使用-ffat-lto-objects编译器选项的链接时优化是 提供gcc兼容性。这意味着ld和ar可以 用于链接和归档目标文件,但这样做会丢失 跨文件优化。
我在Ubuntu 12.04.2上使用icc版本13.1.0(gcc版本4.6.0兼容性)和gcc版本4.6.3。
任何帮助将不胜感激。
答案 0 :(得分:2)
如果使用-ipo,优化将实际发生在链接阶段。
在编译期间(icc -c -ipo),英特尔编译器仅在目标文件中存储其他信息。在链接阶段使用该附加信息来进行实际的过程间优化(ipo)。
因此,为了从IPO中受益,您需要在编译和链接阶段使用英特尔编译器。
答案 1 :(得分:1)
如果您使用xiar创建了存档,那么您希望放置在存档中的所有对象都将使用IPO一起编译并放入静态库中。您将获得一个使用-ipo优化的真实.a文件。
您可以将该库提供给任何人,他们将获得使用-ipo交叉编译库本身的好处,但库代码不会混合在用户对象的其他库中。被联系起来。
基本上,您将使用-ipo(假设其中的所有对象都是使用-ipo构建)完全优化的.a文件,您可以将其提供给客户端。客户代码不会进一步"进一步"使用-ipo优化库。