是否可以在Linux上使用Intel C / C ++编译器来创建要在Windows上链接的目标文件?


12

为什么?

取决于您的来源,英特尔编译器很可能或最肯定会为x86架构生成最快的可执行文件(将执行时间缩短5%至100%)。

英特尔根据非商业许可证免费提供其Linux编译器(我认为我在其页面上的某处免费阅读了该文件:英特尔-非商业软件开发)。还有一个针对学生的免费非商业许可证,但是尽管为所有三个主要操作系统都提供了工具(由于信誉限制而导致链接断开),但该许可证不适用。

目标

我(作为非学生)希望能够使用英特尔编译器来提高非商业许可下的执行速度,以编译可链接以创建Windows(可能是OS)的可执行文件和动态链接库的目标文件。 X)

更多细节:

文档中可以推断出,英特尔编译器会创建与平台的主流编译器兼容的目标文件。

子问题:

  1. Windows和Linux(当前版本)上的gcc,g ++,cl,mingw32,icc,icpc和icl的目标文件格式是什么?
  2. mingw32交叉编译器工具链的一部分可以用来实现目标吗?
  3. 我认为生成的目标文件中的元数据是主要问题吗?

广告2:
mingw32-objcopy似乎能够将Linux(可能是ELF)上的Intel编译器输出转换为与Microsoft兼容的COFF(可重定位目标文件可能除外)。有人可以确认这确实有效吗(适用于非平凡的应用程序)?


1
+1。有趣的问题。
尼尔,

你看过酒吗?AFAIK,Wine提供了一个可在Linux上构建Windows可执行文件的工具链。很可能您可以将icc与此挂钩。您还可以在Wine中运行Windows icc并将其与ming32交叉编译工具链连接起来,从而获得一些成功。我没有尝试过,但是经过充分的摆弄,我认为这应该是可能的。
tdammers

@tdammers据WineHQ称,如果我没有记错的话,在Linux上构建Windows可执行文件的工具链是mingw32。
雨果

在英特尔论坛上,答案似乎是“否”:software.intel.com/zh-cn/forums/topic/282588
Vitor Py

@VitorBraga我这样解释问题:“英特尔编译器是否可以直接交叉编译?” 答案是“否”(据我所知,它缺少必需的选项和库),但是...就我而言,如果我仅使用Windows库,则计算机体系结构(IA32,AMD64)将是相同的在Linux上编译程序,我希望获得可以在Windows中执行的可执行代码-如果与Windows库链接以创建Windows可执行文件。
雨果

Answers:


1

使用交叉编译器可以在Linux构建计算机上创建Windows可执行文件。但是,英特尔提供此类交叉编译器。

回答子问题:

Windows和Linux(当前版本)上的gcc,g ++,cl,mingw32,icc,icpc和icl的目标文件格式是什么?

目标文件的格式由操作系统(或更确切地说,用于构建它的编译器)有效地确定。对于Windows,这是可移植可执行(PE)格式,对于Linux,则是ELF格式。

mingw32交叉编译器工具链的一部分可以用来实现目标吗?

不需要。相关的部分是代码生成器,它既是负责生成正确的对象格式的部分,又是Intel编译器上的部分,它们使生成的代码具有更快的速度。

我认为生成的目标文件中的元数据是主要问题吗?

不。这是一个问题,但还有更多。一个更基本的问题是参数如何传递到内核和/或标准库的潜在差异。IIRC,这些约定在Windows和Linux之间是不同的。


0

答案几乎可以肯定是。我知道可以使用gcc轻松在Linux机器上交叉编译Windows二进制文件(通过mingw32)-显然,您将无法在Linux上运行该程序(除非它在Wine上运行),但是我知道有几个程序可以Windows用这种方式二进制文件。

但是,我不知道Intel编译器是否具有用于此的选项,我应该认为确实如此。

Windows的对象格式是PE,而Linux 的对象格式是ELF


根据msdn的说法:“编译器生成通用对象文件格式(COFF)对象(.obj)文件。” <br/>
Hugo

好的,那没有用。根据维基百科,PE源自COFF,并且两种文件格式都可以用作目标文件格式和可执行文件格式。
雨果

0

通过将C代码链接到任何没有(直接)使用Microsoft的自定义调用约定的内容,您可能有机会使用MinGW的objcopy。我曾用它来转换一个汇编的目标文件,但随后我不必担心调用约定。

我只是花时间尝试这样做,而不是让GCC或clang完全按照您的要求进行。如果这样的加速真的很重要,请使用Intel编译器编译Linux二进制文件,然后尝试查看到底有什么(如果有的话)确实可以加快代码的速度。如果其他所有方法都失败,则可以修补该程序集。


0

我提出以下答案:

关于上下文,可能有(但倾向于)肯定的倾向。

说明:关于“倾斜”部分:尝试这样做似乎并不浪费时间,但是(“输入”部分)考虑到这个答案,与英特尔相比,您可能不会获得执行时间上的改进唯一的工具链。相关的部分是链接器和运行时对编译器的反馈(整个程序优化,配置文件引导的优化,链接时代码生成)。

其他详细信息:
根据MinGW FAQ,使用库和DLL可能会出现问题:
“虽然dll在不同的Windows编译器中具有相当的可移植性,但不能通过库文件(.lib或.a)访问dll。库文件格式特定于特定的编译器,除非编译器提供支持,否则不能与其他编译器一起移植。”

完成答案:
子问题1:

Windows和Linux(当前版本)上的gcc,g ++,cl,mingw32,icc,icpc和icl的目标文件格式是什么?

Windows上任何编译器的默认目标文件格式是COFF(可能是PE变体)。Linux上任何编译器的默认目标文件格式是ELF

子问题2:

mingw32交叉编译器工具链的一部分可以用来实现目标吗?

很可能是(对于链接部分),但是很可能不会大大提高执行时间。

子问题3:

我认为生成的目标文件中的元数据是主要问题吗?

关于链接:是的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.