将使用 ICC 构建的库与使用 GCC 构建的应用程序链接起来

Linking libraries built with ICC with application built with GCC

我有一组静态库,比如lib1.alib2.alib3.a 已使用 ICC(Intel C/C++ 编译器)编译。我将 ICC 与 -ipo -c 一起用于编译以创建 .o 文件,然后使用 XIAR(Intel Archiver)创建 。一个 个图书馆。

我想将这三个库提供给没有 ICC 的客户,因此她将使用 GCC 来编译 link 她的应用程序与这些库。如果她 link这些库是否使用 GCC?

This page 来自英特尔网站的“GCC 兼容性和互操作性”指出:

Link-time optimization using the -ffat-lto-objects compiler option is provided for gcc compatibility. This implies that ld and ar can be used to link and archive object files, but by doing so you will lose cross-file optimizations.

我在 Ubuntu 12.04.2 上使用 icc 版本 13.1.0(gcc 版本 4.6.0 兼容性)和 gcc 版本 4.6.3。

任何帮助将不胜感激。

如果您使用 -ipo,优化将实际发生在 link 阶段。

在编译 (icc -c -ipo) 期间,英特尔编译器仅在目标文件中存储附加信息。此附加信息在 link 阶段用于执行实际的过程间优化 (ipo)。

因此,为了从 IPO 中受益,您需要在编译 link 阶段使用英特尔编译器。

如果您使用 xiar 创建了存档,那么您想要放入存档中的所有对象都会使用 IPO 一起编译并放入您的静态库中。您最终会得到一个使用 -ipo 优化的真实 .a 文件。

您可以将该库提供给任何人,他们将受益于使用 -ipo 对库本身进行交叉编译,但库代码不会混入与其链接的用户对象的其他库中.

基本上,您将拥有一个使用 -ipo 完全优化的 .a 文件(假设其中的所有对象都是使用 -ipo 构建的),您可以将其提供给客户。客户端代码不会 "further" 使用 -ipo 针对您的库进行优化。