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

将使用ICC构建的库与使用GCC构建的应用程序链接,gcc,linker,icc,Gcc,Linker,Icc,我有一组静态库,例如lib1.a、lib2.a和lib3.a,它们是使用ICC(英特尔C/C++编译器)编译的。我使用ICC和-ipo-c进行编译以创建.o文件,然后使用XIAR(英特尔Archiver)创建.a库 我想将这三个库提供给一个没有ICC的客户,因此将使用GCC编译她的应用程序并将其与这些库链接。如果她使用GCC链接这些库,那么速度增益(由于使用-ipo选项构建的libs而产生的跨文件优化预期)是否根本无法实现 英特尔网站上的“GCC兼容性和互操作性””声明: 使用-ffat lto

我有一组静态库,例如lib1.alib2.alib3.a,它们是使用ICC(英特尔C/C++编译器)编译的。我使用ICC和-ipo-c进行编译以创建.o文件,然后使用XIAR(英特尔Archiver)创建.a

我想将这三个库提供给一个没有ICC的客户,因此将使用GCC编译她的应用程序并将其与这些库链接。如果她使用GCC链接这些库,那么速度增益(由于使用-ipo选项构建的libs而产生的跨文件优化预期)是否根本无法实现

英特尔网站上的“GCC兼容性和互操作性””声明:

使用-ffat lto objects编译器选项进行链接时间优化是可行的 提供gcc兼容性。这意味着ld和ar可以 用于链接和归档对象文件,但这样做会丢失 跨文件优化

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


任何帮助都将不胜感激。

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

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


因此,为了从IPO中获益,您需要在编译和链接阶段使用英特尔编译器

如果您使用xiar创建了归档文件,那么您希望放置在归档文件中的所有对象都将使用IPO一起编译并放入您的静态库中。您将得到一个真实的.a文件,该文件使用-ipo进行了优化

您可以将该库提供给任何人,他们将获得库本身与-ipo交叉编译的好处,但库代码不会与它所链接的用户对象的其他库混合


基本上,您将拥有一个.a文件,该文件使用-ipo进行了充分优化(假设其中的所有对象都是使用-ipo构建的),您可以将其提供给客户端。客户席代码不会在“与您的库”席上“进一步”优化。

作为状态,英特尔®C++编译器将生成只有编译器链接器(XILIK..EXE和XILD)可以理解的模拟对象文件,我想GNU链接器无法使用包含在对象文件中的附加信息来进行一些优化。是吗?对不起,我解释得不清楚。是的,链接器必须是Intel链接器,因为GCC链接器忽略了此附加信息/mock objects/intermediate language。谢谢@Alexander。Kittur(来自英特尔)也证实了这一点。你是对的,.a文件使用ipo进行了充分优化(假设所有obj都是使用-ipo构建的)。此外,这样创建的归档文件对真实对象(没有ipo)和模拟对象(ipo)数据有单独的部分。如果我尝试将此存档与英特尔实用程序(ICC、XILD)链接,则它将使用模拟对象数据,完全忽略真实对象数据。如果我尝试将其与非英特尔编译器(GCC)链接,则只会使用真实对象数据来忽略模拟对象数据。因此,如果我必须使用GCC作为链接器,那么使用-ipo选项进行编译是没有意义的。